R 检查if语句中是否存在反应性数据帧
我正在使用R制作一个仪表板,它有一个包含许多图表的概览页面。所有图表都是使用相同的模块创建的。 用户可以选择一个他们希望所有图表显示的主题,但并非所有图表都存在所有主题 因此,通过某些选择,并非所有图表都会显示数据。 在这些情况下,我希望显示一个文本,告诉用户该主题不适用于该特定图表 “我的图表”的输入是一个仅在主题存在时创建的数据框:R 检查if语句中是否存在反应性数据帧,r,if-statement,shiny,reactive,R,If Statement,Shiny,Reactive,我正在使用R制作一个仪表板,它有一个包含许多图表的概览页面。所有图表都是使用相同的模块创建的。 用户可以选择一个他们希望所有图表显示的主题,但并非所有图表都存在所有主题 因此,通过某些选择,并非所有图表都会显示数据。 在这些情况下,我希望显示一个文本,告诉用户该主题不适用于该特定图表 “我的图表”的输入是一个仅在主题存在时创建的数据框: data_indicator <- reactive({ req(input$choice %in% data$subject) dat
data_indicator <- reactive({
req(input$choice %in% data$subject)
data_indicator <- data %>%
filter(subject == input$choice)
})
我作出了两项产出:
一个用于创建图表,另一个用于显示文本
现在我想检查是否已经创建了数据帧来选择要使用的数据帧。我已尝试使用以下语句执行此操作:
output$plot_text <- renderUI({
if (exists("data_indicator()")){
output <- highchartOutput(ns("plot"))
} else {
output <- div(htmlOutput(ns("text")))
}
tagList(output)
})
但是它不起作用,所有的图表现在都显示文本,即使是那些应该可用的
exists命令是否不适用于反应数据集?还是有其他问题?如果您过滤了太多的数据,例如,如果您过滤了一个不包含的变量,data.frame仍然存在,它只有零行。因此,您需要检查它是否有零行,如果是这种情况,您可能希望显示正确的错误或警告消息 更新: OP指出,上述情况不适用于他的反应式数据帧,因为他使用req首先停止数据帧的创建 在这种情况下,建议使用validate/need而不是req 由于req导致输出以静默方式停止,因此在 需要告知用户哪些值丢失或丢失的情况 需要采取哪些用户操作才能继续。 那样的话,你需要 更灵活的验证功能,它提供了 通过验证/需要功能的req功能;reqx基本上只是 ValidateNedx的简写,message=FALSE 摘自 下面我提供了一个使用iris数据集的简单示例 我还建议RStudio使用validate和need函数
library("shiny")
library("dplyr")
library("ggplot2")
shinyApp(
ui = fluidPage(
# Layout with sidebar
sidebarLayout(
## Sidebar -----
sidebarPanel(
# > some example input on sidebar -----
selectInput("choice", "Choose species",
choices = c("none",
unique(as.character(iris$Species))),
selected = "setosa")
), # closes Sidebar-Panel
# Main-Panel ------
mainPanel(
br(),
tabsetPanel(
# > Plot -------
tabPanel("Plot tab",
value = 1,
plotOutput("plot_text")
), # closes tabPanel
id = "tabselected", type = "pills"
) # closes tabsetPanel
) # closes mainPanel
) # closes sidebarLayout
), # closes fluidPage
# Server ------
server = function(input, output, session){
data_indicator <- reactive({
validate(
need(input$choice %in% iris$Species, "No plot available for chosen filter criteria!")
)
iris %>%
mutate(Species = as.character(Species)) %>%
filter(Species == input$choice)
})
output$plot_text <- renderPlot({
# Alternativly use validate here in the following way:
# validate(
# need(input$choice %in% data_indicator()$Species, "No plot available for chosen filter criteria!")
# )
ggplot(data_indicator(), aes(x = Species, y = Sepal.Length)) +
geom_col()
})
} # Closes server
) # Closes ShinyApp
尝试更改为existsdata_指示符号,但它不起作用。由于我的数据帧是被动的,我想我必须添加。谢谢你详细的回答!在我的例子中,日期框没有零行,由于req,它实际上不存在。打印和文本输出的混合确实有效,我在其他模块中使用了它,效果很好。我不确定验证选项是否有效;我不知道如何为它提供合适的条件,因为existsdata_指示器不工作,这是我的问题;我同意使用validate是解决if语句的更好方法!谢谢你的澄清。我没有考虑到您使用req。在您的情况下,似乎建议使用validate而不是req。请参阅我的最新答案。