来自renderDataTable的无效输入

har*_*mug 10 r reactive-programming shiny

更新(2015年12月18日) 此问题的当前最佳应用是:在Shiny App中从DataTable获取所选行

======================

我正在尝试使用用户提供的行选择来反复重新显示数据集.作为一个玩具的例子,

ui.R

library(shiny)

shinyUI(pageWithSidebar(
  headerPanel('Examples of DataTables'),
  sidebarPanel(
    checkboxGroupInput('show_vars', 'Columns to show:', names(mtcars),
                       selected = names(mtcars))
  ),
  mainPanel(
               dataTableOutput("mytable")
    )
  )
)
Run Code Online (Sandbox Code Playgroud)

server.R

library(shiny)

shinyServer(function(input, output) {

  # sorted columns are colored now because CSS are attached to them
  output$mytable = renderDataTable({
    addRadioButtons <- paste0('<input type="radio" name="row', 1:nrow(mtcars), '" value="', 1:nrow(mtcars), '">',"")
    #Display table with radio buttons
    cbind(Pick=addRadioButtons, mtcars[, input$show_vars, drop=FALSE])
  }, options = list(bSortClasses = TRUE, aLengthMenu = c(5, 25, 50), iDisplayLength = 25))

})
Run Code Online (Sandbox Code Playgroud)

来自DataTable的假设无功输入

我想使用单选按钮从用户那里使用一些反应式表达式来收集行号(比如上图中的第4行),比如说rowSelect(),然后在对数据集进行某些操作后动态地重新显示表格,例如,

 mtcars[mtcars[,1] > mtcars[rowSelect(),1], input$show_vars, drop=FALSE]
Run Code Online (Sandbox Code Playgroud)

每次用户选择一行时,它会动态地删除某些行.

更新(7-feb-14)

结合@Julien建议的更改并实现@Vincent建议的方法,server.R变为:

library(shiny)

shinyServer(function(input, output) {

  #reactive row-selection 
  rowSelect <- reactive({
  if(is.null(input[["row"]])) 1 #initialize
  else as.numeric(input[["row"]])})

  # User-selected sorting of dataset
  output$mytable = renderDataTable({
    addRadioButtons <- paste0('<input type="radio" name="row" value="', 1:nrow(mtcars), '">')
    cbind(Pick=addRadioButtons, mtcars[order(mtcars[,1] - rnorm(nrow(mtcars), mtcars[rowSelect(),1])), input$show_vars, drop=FALSE])
  }, options = list(bSortClasses = TRUE, aLengthMenu = c(5, 10, 20), iDisplayLength = 10))
})
Run Code Online (Sandbox Code Playgroud)

正如@agstudy所猜测的那样,重要的是保持数据表中的行数与以前相同(不是子集),因此上面的奇怪的排序操作order(mtcars[,1] - rnorm(nrow(mtcars), mtcars[rowSelect(),1])).

更新2(7-feb-14)

无论如何,这个练习确实揭示了我的例子中的一个缺陷.我的初衷是使用单独的协方差/相似度矩阵来获得基于用户选择的行的显示数据的排序顺序.由于矩阵和表格非常大,因此将它们作为下拉输入列表或侧面板中的任何其他单选按钮输入方法包含在内是没有意义的.它必须在显示整个数据表后来自用户选择.

要实现这一点,只需value使用唯一的行ID 替换radiobutton中的.在server.R中,使用rowSelect()表达式(data是相似性矩阵并且meta是显示的数据表,ID是由data和共享的唯一行标识符meta):

addRadioButtons <- paste0('<input type="radio" name="row" value=', meta[order(data[rowSelect(),]),"ID"], '>')

cbind(Pick=addRadioButtons, meta[order(data[rowSelect(),]),input$show_vars])
Run Code Online (Sandbox Code Playgroud)

这将继续基于用户选择的行求助数据表,同时通过唯一的行ID基于相似性矩阵选择顺序.希望这有助于某人.

但是,如果我使用rowSelect反应式表达式,那么基于排序数据表的行选择将不会为相似性矩阵提供正确的行选择(数据集的顺序会发生变化,但矩阵的顺序也不会发生 - 递归问题) .这意味着我需要收集除行号的无线电输入之外的其他内容 - 更像是一个标识行ID(可以匹配表 - 列中的一个 - 和矩阵),使用表格或单击提交 - 按照以下方式:单击时选择HTML文本输入中的所有文本

谢谢您的帮助.@Vincent,你的应用非常酷.希望最终到达那里.我会接受你的回答.

Vin*_*ent 1

不是一个答案,而是一个较长的评论:我认为你可以这样做,但它会变得有点混乱。一旦有人选择了单选按钮并显示了数据的子集,您如何返回显示所有数据?这仅适用于第一列吗?当数据行数较少时,您是否要重新创建所有单选按钮?renderDataTable(在某些时候)可以选择在每列下方的框中包含类似“> 20”的内容。与此同时,您最好尝试使用 textInput 对数据进行子集化。例如,请参阅此应用程序中的数据 > 查看。如果这不是您想要的,请让我(我们)知道您想要实现的目标。