【问题标题】:SelectInput for Every Row of the table in Shiny在 Shiny 中为表格的每一行选择输入
【发布时间】:2019-04-13 07:38:00
【问题描述】:

我有一个包含三列和可变行数的表。我想创建一个列,使新列的每一行都包含一个值为 Yes/No 的 selectInput。

简而言之,我如何自动生成等于我表中行数的 selectInput

这是一个简单的代码:

library(shiny)
library(rhandsontable)

ui <- fluidPage(

  tableOutput('Simpletable')

)

server <- function(input,output,session)({

  data <- data.frame(c1=c(5,10,15), c2=c(3,6,9) , diff=c(0,0,0), select= as.logical( c(FALSE,FALSE,FALSE)))


  output$Simpletable <- renderTable(
    data
  )

}) 

shinyApp(ui = ui, server = server) 

对于这个表格,三个 selectInputs 应该出现在表格旁边

这可能吗?

谢谢

【问题讨论】:

  • 你用selectInputs做什么?

标签: r shiny dt


【解决方案1】:

这是一个使用library(DT)的解决方案——我们需要设置escape = FALSE

library(shiny)
library(DT)
library(data.table)

myTable <- data.table(c1=c(5,10,15), c2=c(3,6,9) , diff=c(0,0,0))
myTable[, row_id := paste0("row_select_", .I)][, select := as.character(selectInput(inputId=row_id, label=NULL, choices=c(yes=TRUE, no=FALSE))), by = row_id]

ui <- fluidPage(
  dataTableOutput('myTableOutput'),
  htmlOutput("mySelection")
)

server <- function(input, output, session){
  output$myTableOutput <- DT::renderDataTable({
    datatable(myTable, escape = FALSE, options = list(
      preDrawCallback = JS('function() { Shiny.unbindAll(this.api().table().node()); }'),
      drawCallback = JS('function() { Shiny.bindAll(this.api().table().node()); }')
    ))
  })
  
  output$mySelection <- renderUI({
    HTML(paste0(myTable$row_id, ": ", lapply(myTable$row_id, function(x){input[[x]]}), collapse = "<br>"))
  })
} 

shinyApp(ui = ui, server = server) 

如果您需要重新渲染表格(使用Shiny.bindAll 时)请参阅此related post


编辑:这是按照@Fahadakbar 的要求将用户输入合并到表格中的方法。

library(shiny)
library(DT)
library(data.table)

myTable <- data.table(c1=c(5,10,15), c2=c(3,6,9) , diff=c(0,0,0))
myTable[, row_id := paste0("row_select_", .I)][, select := as.character(selectInput(inputId=row_id, label=NULL, choices=c(yes=TRUE, no=FALSE))), by = row_id][, diff := c1-c2]

ui <- fluidPage(
  dataTableOutput('myTableOutput'),
  htmlOutput("mySelection")
)

server <- function(input, output, session){
  output$myTableOutput <- DT::renderDataTable({
    datatable(myTable, escape = FALSE, options = list(
      preDrawCallback = JS('function() { Shiny.unbindAll(this.api().table().node()); }'),
      drawCallback = JS('function() { Shiny.bindAll(this.api().table().node()); }')
    ))
  })
  
  output$mySelection <- renderUI({
    HTML(paste0(myTable$row_id, ": ", lapply(myTable$row_id, function(x){input[[x]]}), collapse = "<br>"))
  })
  
  myReactiveTable <- reactive({
    myTable[, selected := as.logical(unlist(lapply(row_id, function(x){input[[x]]})))]
    
    if(is.null(myTable$selected)){
      myTable[, diff := NA_real_][, selected := NULL]
    } else {
      myTable[, diff := fifelse(selected, yes = c1-c2, no = NA_real_)][, select := as.character(selectInput(inputId=row_id, label=NULL, choices=c(yes=TRUE, no=FALSE), selected = input[[row_id]])), by = row_id][, selected := NULL]
    }
  })
  
  myTableProxy <- dataTableProxy("myTableOutput", session)
  
  observeEvent(myReactiveTable(), {
    replaceData(myTableProxy, data = myReactiveTable(), resetPaging = FALSE)
  })
  
} 

shinyApp(ui = ui, server = server) 

另见我的相关回答here

【讨论】:

  • 有趣,如果从输入中选择是,我如何制作差异列来计算 C1 和 C2 之间的差异?
  • 你需要编写一个 JS 回调函数。有关示例,请参见 this
  • @Fahadakbar 根据用户输入计算差异也可以在 R 中完成 - 请参阅我的编辑。
猜你喜欢
  • 2016-12-30
  • 2013-05-20
  • 1970-01-01
  • 1970-01-01
  • 2019-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多