在 DataTable 输出中使用 Shiny 输入
Posted
技术标签:
【中文标题】在 DataTable 输出中使用 Shiny 输入【英文标题】:Using Shiny inputs inside a DataTable output 【发布时间】:2016-07-12 14:43:53 【问题描述】:我想动态创建一系列输入小部件以在数据表的每一行中使用。我能够成功地在表中显示这样的输入列表,但是我无法访问这些动态输入的值。
ui.R
library(shiny)
ui <- fluidPage(
fluidRow(
radioButtons('original','Normal Radio Button',c('1','2','3','4','5')),
DT::dataTableOutput("table")
)
)
server.R
library(DT)
multipleRadio <- function(FUN, id_nums, id_base, label, choices, ...)
inputs <- 1:length(id_nums)
for (i in 1:length(inputs))
inputs[i] <- as.character(FUN(paste0(id_base, id_nums[i]),label, choices, ...))
return(inputs)
radio_inputs <- multipleRadio(radioButtons,
as.character(1:3),
'input_',
'Radio Button',
c('1','2','3','4','5'),
inline = TRUE)
output_table <- data.frame(id = c(1,2,3),
name=c('Item 1','Item 2','Item 3'),
select = radio_inputs)
server <- function(input, output, session)
observe(
print(paste('original: ',input$original))
print(paste('input 1: ',input$input_1))
print(paste('input 2: ',input$input_2))
print(paste('input 3: ',input$input_3))
)
output$table <- renderDataTable(
datatable(output_table,rownames= FALSE,escape = FALSE,selection='single',
options = list(paging = FALSE,ordering=FALSE,searching=FALSE))
)
我定义了一个函数,它生成多个radioButton 输入并使用as.character 将它们转换为它们的html 表示。这会生成一系列输入,其 ID 为“input_1”、“input_2”和“input_3”。我用无线电输入填充输出表的一列。 radioButtons 的显示按预期工作。我在每一行看到一个。但是,input$input_1
、input$input_2
和 input$input_3
似乎不存在,并且单击这些按钮没有响应。任何关于这里出了什么问题的提示将不胜感激!
编辑:
我在这里找到了解决方案: http://www.***.red/questions/32993257/shiny-datatables-with-interactive-elements
在渲染数据表时使用 Shiny.bindAll 函数似乎可以将 HTML 输入转换为 Shiny 输入对象。
output$table <- renderDataTable(
datatable(output_table,rownames= FALSE,escape = FALSE,selection='single',
options = list(paging = FALSE,ordering=FALSE,searching=FALSE,
preDrawCallback=JS('function() Shiny.unbindAll(this.api().table().node()); '),
drawCallback=JS('function() Shiny.bindAll(this.api().table().node()); ')))
)
【问题讨论】:
关键是使用renderUI
创建动态输入。有关我之前回答的问题,请参阅 ***.com/questions/36094718/r-shiny-dynamic-input/…。
谢谢,@warmoverflow。使用renderUI
生成输入后,如何用它们填充数据表?
您只需读取input$input1
等值
@warmoverflow 啊,我希望小部件本身显示在数据表中,而不是输入的值。对不起,如果我不清楚。
对不起,我误解了你的问题。我怀疑由于 DT 和闪亮的输入都使用 javascript,将一个嵌套在另一个内部会破坏一些东西。
【参考方案1】:
正确的shiny
输入对象是shiny.tag
对象,您不能将其放入data.frame。如果这样做,您将收到以下错误消息:
as.data.frame.default(x[[i]], optional = TRUE, stringsAsFactors = stringsAsFactors) : 不能强制类 ""shiny.tag"" 到 data.frame
在您的示例中,您获得的radio_inputs
对象实际上是character
的列表,它是纯HTML 代码。因此,您仍然可以获得 UI,但它们不再用作闪亮的输入。
如果您想要单选按钮或表格内的任何其他闪亮输入对象,我想唯一的方法是使用纯 HTML 表格。
【讨论】:
以上是关于在 DataTable 输出中使用 Shiny 输入的主要内容,如果未能解决你的问题,请参考以下文章
如何在Shiny R中丢弃DT :: datatable上的用户编辑
如何在 Shiny 中使用 DataTable Extensions 更改下载文件中的名称?