如何检查会话中是否存在反应性数据框,如果不存在,如何将列表中的值设置为 'NA'

How to check if reactive a dataframe exists in session and set value in a list as 'NA' if it does not

我正在研究一项功能,它允许我的降价文件根据从我闪亮的应用程序发送的参数有条件地执行块。有关其工作原理的一些信息:https://shiny.rstudio.com/articles/generating-reports.html

downloadhandler() 中有一个调用 params = 的参数,我给它一个列表,例如这个列表看起来像这样; params <- list(report_name = input$J, data = data(), data2 = data2())

所以我的目标是有一个 if else 语句,将 data2 编码为 NULLNA,如下所示; data2 = if( exists("data2") ) {data2()} else {NA}

如果 data2() 不存在或以某种方式为空,这将允许我通过设置 eval='someconditionthatsfalse' 来停止 运行 中的某些降价块。

我 运行 遇到的问题是,它始终存在。

如有任何帮助,我们将不胜感激。

帮助解决问题的代表。

library(shiny)

ui <- fluidPage(
  actionButton("simulate", "go"),
  textOutput("doesitexist")
)

server <- function(input, output, session) {
  
  output$doesitexist <- renderText({
    
    if( exists("data2") ) {print("yes it exists")} else {print("not it does not exist")}
    
  })

  
  data2 <- eventReactive(input$simulate, {
    data.frame(x = 1)
  })
  

}

shinyApp(ui, server) 

您的代码有几个问题。首先,data2 是您按钮的观察者,而不是您要测试其存在的 data.frame。它将始终存在于您的服务器功能中,这就是为什么它总是存在的测试 returns TRUE。其次,因为 - 无论您如何设置 - 您的反应将始终存在于服务器功能中,exists 将不起作用。您需要使用另一个条件并采取间接方法。我选择使用 reactiveValues.

[您也可以使用 reactiveValue,但我更喜欢 reactiveValues,即使我只有一个反应值要处理,因为从一个反应值移动到多个反应值时语法保持不变一个。]

我将反应值设置为 NA 开始,然后用 is.na 测试是否存在。

这是一些工作代码:

library(shiny)

ui <- fluidPage(
  actionButton("simulate", "Go"),
  textOutput("doesitexist")
)

server <- function(input, output, session) {
  v <- reactiveValues(data2=NA)

  output$doesitexist <- renderText({
    if (is.na(v$data2)) "No, it doesn't exist" else "Yes, it does exist"
  })

  observeEvent(input$simulate, { v$data2 <- data.frame(x=1)})
}

shinyApp(ui, server)