Shiny框架中如何合并renderUI与renderDataTable代码?需保留uiOutput
解决Shiny中合并uiOutput与DT渲染代码的问题
首先得说清楚你为啥会报错:你之前的写法把DT::renderDataTable()的结果直接传给了DT::dataTableOutput(),但这俩根本不是一个路数的东西——renderDataTable()返回的是一个用来生成表格数据的闭包函数,而dataTableOutput()需要的是一个字符串类型的输出ID,这就好比你把发动机直接装到方向盘上,肯定跑不起来嘛!
那怎么在保持output$abc是uiOutput的前提下,把两行代码合并呢?其实很简单,我们可以在renderUI的表达式里先完成output$dt_output的注册,再返回对应的UI组件就行:
library(shiny) library(DT) library(data.table) ui <- fluidPage(uiOutput("abc")) server <- function(input, output, session) { output$abc <- renderUI({ # 先注册表格的渲染逻辑 output$dt_output <- renderDataTable({ data.table(a = 1:3, b = 4:6) }) # 再返回对应的UI输出组件 dataTableOutput("dt_output") }) } runApp(list(ui = ui, server = server))
这么写的原理是:renderUI的表达式可以执行任意R代码,包括给output对象赋值。当uiOutput("abc")被渲染时,它会先让output$dt_output注册好渲染逻辑,然后返回dataTableOutput这个UI元素,Shiny就能正确把数据和UI对应起来了,不会再报那个类型转换的错误。
另外提醒一下,记得提前加载DT和data.table包哦,不然代码可能会因为找不到函数而报错~
内容的提问来源于stack exchange,提问作者johnny
相关产品推荐
相关产品推荐

