【问题标题】:reactive expression result different反应式表达结果不同
【发布时间】:2017-05-29 21:19:35
【问题描述】:

抱歉,我是 Shiny 的新手。我最近尝试使用响应式程序来完成一个项目。但现在我面临一个无法弄清楚为什么会发生这种情况的问题。

首先,我创建了一个反应式表达式,它列出了一个文件夹中的所有文件。

 fullFilenames <- reactive({list.files(workDir, pattern="*.csv.gz", full.names=TRUE)})

然后,我观察到一个按钮事件来触发重新扫描文件夹中的文件并更新updateCheckboxGroupInput

我在"print("File Scaned")"设置了一个断点。

当我们启动应用程序时,复选框组正确显示文件夹下的所有文件。

然后我删除/添加工作文件夹下的文件,然后单击重新扫描按钮。但是复选框组没有得到更新。

当程序在断点处停止时,我检查了值“fullFilenames”和“fullFilenames()”,发现 fullFilenames 已更新,但 fullFilenames() 未更新。我试图了解两个值背后的逻辑是不同的,并找到一种方法如何以正确的方式更新复选框组。

您能否就这个问题提供一些帮助?

非常感谢。

参考以下代码:

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)

【问题讨论】:

  • 你能提供一个可重现的例子吗?
  • @SBista,已更新。非常感谢。

标签: r shiny


【解决方案1】:

我已经修改了您的代码,以便您在单击重新扫描按钮后获得更新的列表。

在 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")
      })
    }

希望这会有所帮助!

【讨论】:

  • 谢谢,@Sbista。我认为这是使用反应式表达的正确方法。但是我之前试过这个,这不会更新文件,都保持与启动应用程序时相同的文件列表。
  • 这似乎对我有用。我不确定你的问题是什么。
  • 这是我重现故障的过程:如果我只是启动应用程序,那么它将显示文件夹下的所有文件。之后,如果我删除了工作目录下的一些文件,然后单击重新扫描按钮。它不会显示更新的文件列表。顺便说一句,您测试的是哪个操作系统?
  • 我的程序也是一样的,它对我有用。我在 Windows 7 上。顺便说一下,我检查了 csv 文件而不是 csv.gz。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-09
  • 2019-08-28
相关资源
最近更新 更多