闪亮:使用全局变量的列名更新 varSelectInput()
Shiny: update varSelectInput() using the column names of a global variable
我有一个闪亮的应用程序,它读取一个csv数据table,然后处理table并将处理后的数据保存为全局变量DFG
(我使用<<- 赋值运算符来产生这个全局变量)。此全局变量将在另一个会话中用于进一步的数据分析。
在新的 shiny 会话中,我想访问这个全局变量的列名并用它来对数据进行子集化。
然而,它没有用。 varSelectInput()
似乎无法更新。
当我尝试使用 R 内部数据 iris
时,代码有效。我不知道我应该怎么做才能让它适用于我的全局变量。
- 它适用于
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)
基本上我想做的是这样的:
- 它不适用于我的全局数据
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)
- 这个方法有效。但我不明白为什么。这种方法对我来说并不理想,因为我没有用户上传列名称的先验信息。
假设我的 DFG
有两列,名为 Group1
和 Group2
然后,如果我添加代码 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)
我有一个闪亮的应用程序,它读取一个csv数据table,然后处理table并将处理后的数据保存为全局变量DFG
(我使用<<- 赋值运算符来产生这个全局变量)。此全局变量将在另一个会话中用于进一步的数据分析。
在新的 shiny 会话中,我想访问这个全局变量的列名并用它来对数据进行子集化。
然而,它没有用。 varSelectInput()
似乎无法更新。
当我尝试使用 R 内部数据 iris
时,代码有效。我不知道我应该怎么做才能让它适用于我的全局变量。
- 它适用于
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)
基本上我想做的是这样的:
- 它不适用于我的全局数据
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)
- 这个方法有效。但我不明白为什么。这种方法对我来说并不理想,因为我没有用户上传列名称的先验信息。
假设我的 DFG
有两列,名为 Group1
和 Group2
然后,如果我添加代码 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)