反应表达结果不同

时间:2017-05-29 11:58:16

标签: r shiny

对不起,我是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)

1 个答案:

答案 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")
      })
    }

希望这有帮助!