【发布时间】: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)。如果你想在其他地方引用这个,那么你需要将变量分配给全局环境,使用
<<-而不是<-。认为值得一提,以防它在这种情况下对您有所帮助。