R 条件面板不';t按预期显示,但出现警告消息
我有一个带有条件面板的应用程序,它取决于一系列用户选择。这太复杂了,无法提供一个可复制的示例,但我将尝试给出一个简化的版本,以获得我所要求的内容,并包括实际应用程序中的相关部分 在我的应用程序中,如果用户加载Excel文件,然后从单选按钮中选择另一个条件,则会出现某个条件面板。如果加载了Excel文件并进行了适当的选择,则给定的条件面板将按预期显示。如果加载了csv文件,则不会显示“条件”面板,但会在其应位于的位置周围显示一条红色消息R 条件面板不';t按预期显示,但出现警告消息,r,shiny,R,Shiny,我有一个带有条件面板的应用程序,它取决于一系列用户选择。这太复杂了,无法提供一个可复制的示例,但我将尝试给出一个简化的版本,以获得我所要求的内容,并包括实际应用程序中的相关部分 在我的应用程序中,如果用户加载Excel文件,然后从单选按钮中选择另一个条件,则会出现某个条件面板。如果加载了Excel文件并进行了适当的选择,则给定的条件面板将按预期显示。如果加载了csv文件,则不会显示“条件”面板,但会在其应位于的位置周围显示一条红色消息object sheetrID not found。这个错误(
object sheetrID not found
。这个错误(实际上是一个警告)纯粹是表面现象,但我想了解为什么会发生这种情况
在这个简单的应用程序中,在条件面板上获取类似错误消息的方法是什么
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)
方法_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
output$select\u method\u cat为了演示我上面的评论,这里是示例应用程序的一个改编版本,它会生成相同的错误消息。但是,正如我提到的,该错误与您的应用程序无关,而是由于使用了openxlsx::loadWorkbook()
在本例中,当您将滑块移动超过40并成功上载文件后,条件面板将打开。如果使用openxlsx::loadWorkbook()
尝试访问.csv,则会出现您描述的错误(未成功上载),面板将无法打开。您可以切换到read.csv()
以避免错误并打开面板
在您的情况下,如果您不希望在用户尝试上载.csv文件时打开面板,那么最好包含一个函数,告诉用户上载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)
库(闪亮)
uisheetrID
已分配给excel工作簿。在中间添加req()
语句,看看这是否是由于使用命令读取文件而导致的错误?也许添加一个取决于您的文件类型的条件会有所帮助。@ADuv,我已经有一个条件,即getExtension==xlsx,以便面板显示……您是否正在使用openxlsx::loadWorkbook()
加载Excel文件sheetrID
是一个临时对象,用于loadWorkbook
函数中的各种用途。如果创建csv文件并尝试在本地R环境中使用loadWorkbook
访问该文件,则会出现相同的错误。我猜你的应用程序中的错误只是与该功能的使用有关,而与你的应用程序或构造无关。所以@ADuv走上了正确的道路,我认为……这只是一个一般性的陈述,可能(也可能不)适用于您的情况,但我以前遇到过这样一个涉及环境的问题。在这些情况下,我发现Shining将变量放置在相关函数的环境中(例如observeEvent)。如果您试图在shiny中的其他地方引用该变量,则需要使用@matsuo_basho将该变量分配给全局环境-如果您尝试加载.xlsx文件,我没有意识到这会产生错误。现在已经修复了,希望能澄清错误的来源。
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)