对不起,我是Shiny的新手。我最近尝试使用被动程序来完成一个项目。但现在我面临一个无法弄清楚为什么会发生这种情况的问题。
首先,我创建一个反应式表达式,列出一个文件夹中的所有文件。
fullFilenames <- reactive({list.files(workDir, pattern="*.csv.gz", full.names=TRUE)})
然后,我观察一个按钮事件,触发重新扫描文件夹中的文件并更新updateCheckboxGroupInput
。
我在"print("File Scaned")"
设置断点。
当我们启动应用程序时,复选框组会正确显示文件夹下的所有文件。
然后我删除/添加工作文件夹下的文件,然后单击重新扫描按钮。但Checkbox Group没有更新。
当程序在断点处停止时,我检查了值&#34; fullFilenames&#34;和&#34; fullFilenames()&#34;,并发现fullFilenames已更新,但不是fullFilenames()。我试图理解两个值背后的逻辑是不同的,并找到一种方法如何以正确的方式更新Checkbox组。
你能否就这个问题提供一些帮助?
非常感谢。
参考下面的代码:
library(shiny)
library(shinydashboard)
workDir<-c("c:/files")
setwd(workDir)
ui <- dashboardPage(
dashboardHeader(title = "Test Tool"),
dashboardSidebar(
sidebarMenu(
menuItem("Setup", tabName = "setup", icon = icon("cogs"))
)
),
dashboardBody(
tabItem(tabName = "setup",
fluidRow(
box(width = 12,
h1("Setup before generate dashboard"),
p(class = "text-muted",
br(),
"Default all files under working directory been selected, you also can choice your desired files.",
br(),
br()
),
fluidRow(
column(12, align="center",
actionButton("rescanFilesBtn","Rescan CSV Files")
)
)
)
),
fluidRow(
column(width = 12,
box(width = NULL, style = "max-height: 500px", status = "info", solidHeader = TRUE,
title = "Change raw CSV files as you like",
textInput("csvFileFilter","Desired CSV Files", placeholder = "File names, separate by semicolon"),
checkboxGroupInput("selectedFiles", "",
choiceValues = NULL,
choiceNames= NULL,
selected = NULL
)
)
)
)
)
)
)
server <- function(input, output, session) {
fullFilenames <- reactive({list.files(workDir, pattern="*.csv.gz", full.names=TRUE)})
observeEvent(input$rescanFilesBtn, {
print("Scan Files")
fullFilenames <- list.files(workDir, pattern="*.csv.gz", full.names=TRUE)
updateCheckboxGroupInput(session, "selectedFiles", choices = fullFilenames)
print("File Scaned")
})
}
shinyApp(ui, server)
答案 0 :(得分:0)
我修改了您的代码,以便在单击重新扫描按钮后获得更新列表。
在ui部分,我更改了您的checkboxGroupInput
,如下所示:
checkboxGroupInput("selectedFiles", "",
choices = list.files(workDir, pattern="*.csv.gz", full.names=TRUE),
selected = NULL)
这样做是因为选择不能是NULL
。
我刚刚在您的服务器代码中注释了一行,因为您的被动值和本地变量具有相同的名称,因此您没有获得fullFilenames()
的任何值
这是修改后的服务器:
server <- function(input, output, session) {
fullFilenames <- reactive({list.files(workDir, pattern="*.csv.gz", full.names=TRUE)})
observeEvent(input$rescanFilesBtn, {
print("Scan Files")
# fullFilenames <- list.files(workDir, pattern="*.csv.gz", full.names=TRUE)
updateCheckboxGroupInput(session, "selectedFiles", choices = fullFilenames())
print("File Scaned")
})
}
希望这有帮助!