闪亮:使用全局变量的列名更新 varSelectInput()

Shiny: update varSelectInput() using the column names of a global variable

我有一个闪亮的应用程序,它读取一个csv数据table,然后处理table并将处理后的数据保存为全局变量DFG(我使用<<- 赋值运算符来产生这个全局变量)。此全局变量将在另一个会话中用于进一步的数据分析。

在新的 shiny 会话中,我想访问这个全局变量的列名并用它来对数据进行子集化。

然而,它没有用。 varSelectInput() 似乎无法更新。

当我尝试使用 R 内部数据 iris 时,代码有效。我不知道我应该怎么做才能让它适用于我的全局变量。

  1. 它适用于 Iris 数据
library(shiny)

ui = fluidPage(
  varSelectInput(inputId = "getColumn", label="Get Column", data = ""),
  tableOutput("table")
)

server = function(input, output, session){

  StatGroup <- reactive({
    return(as.character(input$getColumn))
  })
  
  updateVarSelectInput(inputId = "getColumn",
                       data = iris,
                       selected = "")
  
  output$table <- renderTable(iris[, StatGroup(), drop = FALSE])

}

shinyApp(ui, server)

基本上我想做的是这样的:

  1. 它不适用于我的全局数据DFG
library(shiny)

ui = fluidPage(
  varSelectInput(inputId = "getColumn", label="Get Column", data = ""),
  tableOutput("table")
)

server = function(input, output, session){

  StatGroup <- reactive({
    return(as.character(input$getColumn))
  })

if(!exists(deparse(substitute(DFG)))) {DFG <- NULL} # this one does not work

  updateVarSelectInput(inputId = "getColumn",
                       data = DFG,
                       selected = "")
  
  output$table <- renderTable(iris[, StatGroup(), drop = FALSE])

}

shinyApp(ui, server)
  1. 这个方法有效。但我不明白为什么。这种方法对我来说并不理想,因为我没有用户上传列名称的先验信息。

假设我的 DFG 有两列,名为 Group1Group2

然后,如果我添加代码 DFG <- data.frame(Group1 = "", Group2 = ""),它就会起作用。

library(shiny)

ui = fluidPage(
  varSelectInput(inputId = "getColumn", label="Get Column", data = ""),
  tableOutput("table")
)

server = function(input, output, session){

  StatGroup <- reactive({
    return(as.character(input$getColumn))
  })

  DFG <- data.frame(Group1 = "", Group2 = "") ## with this code, it worked
  
  updateVarSelectInput(inputId = "getColumn",
                       data = DFG,
                       selected = "")
  
  output$table <- renderTable(iris[, StatGroup(), drop = FALSE])

}

shinyApp(ui, server)

不要使用普通的旧全局变量来存储数据,而是使用您预先定义的全局反应值。然后当更新时,其他使用它的会话也会收到通知。

library(shiny)

global_data <- reactiveVal(NULL)

ui <- fluidPage(
  actionButton("go", "Sample a dataset"),
  varSelectInput("col", "Pick a column", NULL)
)

server <- function(input, output, session) {
  observeEvent(input$go, {
    dataset <- NULL
    while (is.null(names(dataset))) {
      dataset <- sample(ls("package:datasets"), 1)
      dataset <- get(dataset, "package:datasets")
    }
    global_data(dataset)
  })
  
  observeEvent(global_data(), {
    updateVarSelectInput(session, "col", data = global_data())
  })
}

shinyApp(ui, server)