【问题标题】:Conditional panel doesn't display as expected but warning message appears条件面板未按预期显示,但出现警告消息
【发布时间】:2018-10-07 19:11:21
【问题描述】:

我有一个带有取决于一系列用户选择的条件面板的应用。提供可重现的示例太复杂了,但我会尝试提供一个简化版本来获得我所要求的内容,并包含来自实际应用的相关部分。

在我的应用程序中,如果用户加载 Excel 文件然后从单选按钮中选择另一个条件,则会出现某个条件面板。如果加载了 Excel 文件并进行了适当的选择,则给定的条件面板将按预期显示。如果加载了 csv 文件,则条件面板不会出现,但在应该为 object sheetrID not found 的位置周围会出现一条红色消息。该错误(实际上是 Shiny 中的警告)纯粹是装饰性的,但我想了解为什么会发生这种情况。

作为解决此问题的一种方法,在这个简单的应用程序的条件面板上获得类似错误消息的方法是什么:

library(shiny)

ui <- fluidPage(

  column(3,
         h3("Add new data"),
         uiOutput("dummyslider")
  ), # close column

  column(9,
         h3("Matching"),
         uiOutput("condition_select")
  ) # close column

) # close fluidPage


server <- function(input, output, session) {

  output$dummyslider <- renderUI({ 
    sliderInput(inputId = "num",
                label = "Choose a number",
                value = 25, min = 1, max = 100)
  })

  output$condition_select <- shiny::renderUI({
  shiny::conditionalPanel(
    condition="input.num > 40",
    shiny::sliderInput(
      inputId="slider2",
      label="test label",
      min=0,
      max=1,
      value=0.1,
      step=0.01
    )
  )
})

} # close server

shinyApp(ui = ui, server = server)

编辑: 作为对@Pork Chop 建议的回应——目前还不清楚我将在哪里插入req 语句。条件面板依赖 input$method_cat 为“两者”才能显示面板。我插入了验证 input$method_cat 不是工作表的打印语句,并且还验证了 getExtension 是 'csv':

output$condition_cat_both <- shiny::renderUI({
print(input$method_cat)
print(getExtension())
shiny::conditionalPanel(
  condition="input.method_cat == 'both'",
  shinyWidgets::pickerInput(
    inputId="cat_vars_selected_both",
    label="Select variables you wish to be categorical:",
    choices=smartSelectionCatVars(importDataSet(), importCatVarLookup()),
    multiple=TRUE,
    options = list(`actions-box` = TRUE)
  ), # close pickerInput
) # close conditionalPanel

method_cat 是单选按钮的输出:

output$select_method_cat <- shiny::renderUI({
    shinyWidgets::awesomeRadio(
      inputId="method_cat",
      label="Select the method to treat categorical variables:",
      choices=getMethodCatOptions(),
      selected="thresh"
    )
  }) # close renderUI

只有当加载的文件是 Excel 时,getMethodCatOptions 才会返回 'both' 作为单选按钮选项之一:

getMethodCatOptions <- shiny::reactive({
    req(input$variable_relations)
    req(input$cat_var_lookup)
    if(getExtension() == "xlsx" && input$variable_relations == "Yes" && 
      input$cat_var_lookup == "Yes") {
      return(c("Threshold"="thresh", "Select Variables Specifically"="pick", 
        "Use categorical variable lookup"="sheet", 
        "Select both"="both"))
    }
    return(c("Threshold"="thresh", "Select Variables Specifically"="pick"))
  }) # close reactive

因此,不清楚我将在哪里插入 req 语句,因为根据定义,条件面板仅应在输入文件是 Excel 时出现(因为这是触发“工作表”作为选项之一输出的唯一内容的单选按钮)。

更新: 我意识到这个所谓的错误消息实际上是 Shiny 中的警告:`警告:匹配错误:找不到对象'sheetrId'

我可以取消警告,从而消除问题,但我更愿意理解为什么会发生这种情况。难道是因为条件面板在renderUI函数里面?

再一次,我的玩具示例也有同样的情况,那个条件面板没有问题......

【问题讨论】:

  • sheetrID 已分配给 Excel 工作簿。在两者之间添加req() 语句,看看是否有帮助
  • 可能是因为读取文件的命令导致的错误?也许添加一个取决于您的文件类型的条件会有所帮助。
  • @ADuv,我已经有一个条件 getExtension==xlsx 才能让面板出现......
  • 您是否使用openxlsx::loadWorkbook() 加载Excel 文件? sheetrID 是一个临时对象,用于loadWorkbook 函数中的多种用途。如果您创建一个 csv 文件并尝试在本地 R 环境中使用 loadWorkbook 访问它,则会收到相同的错误。我猜您的应用程序中的错误只是与该功能的使用有关,与您的应用程序或构造无关。所以@ADuv 是在正确的轨道上,我认为......
  • 只是一个可能(或可能不)适用于您的情况的一般性陈述,但我之前遇到过涉及环境的此类问题的问题。在这些情况下,我发现闪亮会在相关函数的环境中放置一个变量(例如observeEvent)。如果你想在其他地方引用这个,那么你需要将变量分配给全局环境,使用&lt;&lt;-而不是&lt;-。认为值得一提,以防它在这种情况下对您有所帮助。

标签: r shiny


【解决方案1】:

为了演示我上面的评论,这里是您的示例应用程序的改编版本,它会产生相同的错误消息。但是,正如我所提到的,该错误与您的应用程序无关,而是使用openxlsx::loadWorkbook() 的结果。

在此示例中,一旦您将滑块移动到 40 并成功上传文件,条件面板就会打开。如果您使用 openxlsx::loadWorkbook() 尝试访问 .csv,则会收到您描述的错误(不是成功上传)并且面板将无法打开。您可以切换到read.csv()以避免错误并打开面板。

在您的情况下,如果您不希望面板在用户尝试上传 .csv 文件时打开,则包含 validate() 函数来告诉用户上传 Excel 文件可能更有指导意义比 .csv。

更新的用户界面:

library(shiny)

ui <- fluidPage(  
  column(3,
     h3("Add new data"),
     uiOutput("dummyslider")
  ), # close column
  column(3,
     h3("Matching"),
     uiOutput("condition_select")
  ), # close column
  column(3,
     h3("Table/error"),
     tableOutput("tbl")
  )
) # close fluidPage

更新的服务器:

server <- function(input, output, session) {
  output$dummyslider <- renderUI({
    tagList(
      sliderInput(inputId = "num",
            label = "Choose a number",
            value = 25, min = 1, max = 100),
      fileInput("upl", label = "Upload any .csv file:")
    )
  })
  output$condition_select <- shiny::renderUI({
    shiny::conditionalPanel(
      condition="input.num > 40 & output.uploaded",
      shiny::sliderInput(
        inputId="slider2",
        label="test label",
        min=0,
        max=1,
        value=0.1,
        step=0.01
      )
    )
  })
  data <- reactive({
    uplFile <- input$upl
    if (is.null(uplFile))
      return(NULL)
    #tbl <- read.csv(uplFile$datapath)
    tbl <- openxlsx::loadWorkbook(file=as.character(uplFile$datapath))
    return(tbl)
  })
  output$uploaded <- reactive({ return( !is.null(data()) ) })
  outputOptions(output, "uploaded", suspendWhenHidden=FALSE)
  output$tbl <- renderTable ({
    if (is.null(data())) return()
    head(data.frame(read.xlsx(data())),10)
  })
}

shinyApp(ui, server)

【讨论】:

  • @matsuo_basho - 如果您尝试加载 .xlsx 文件,我没有意识到这会产生错误。它现在已修复,希望能澄清您的错误来自何处。
猜你喜欢
  • 1970-01-01
  • 2015-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-03
  • 1970-01-01
相关资源
最近更新 更多