我正在尝试制作一个闪亮的应用程序,它采用一个用于过滤数据集的数值并将过滤后的数据作为表格返回。我可以让应用程序执行我想要的操作,但是当我插入 validate() 以便在过滤器输入不是有效值时能够返回自定义消息。 这是我的代码:
in_data <- mtcars %>%
distinct(hp, .keep_all = T)
ui <- navbarPage("demo",
collapsible = T,
tabPanel("Cars One", uiOutput("page1")),
tabPanel("Car Tool", uiOutput("page2"))
)
server <- function(input, output){
output$page1 <- renderUI({
renderText('Page One')
})
output$page2 <- renderUI({
fluidPage(
sidebarLayout(
sidebarPanel(
numericInput(
'input_hp', 'Enter HP:', 1, min = 1
)
),
mainPanel(
DTOutput('car_spec')
)
)
)
})
car_data <- reactive({
in_data %>%
filter(hp == input$input_hp) %>%
t()
})
output$car_spec <- DT::renderDT({
# check that the hp is available
validate(need(nrow(car_data()) < 1,
"Choose a different HP."))
DT::datatable(
car_data(),
options = list(
pageLength = 20,
autoWidth = F,
scrollX=T,
dom = 't'
) # end of options
)
})
}
# Run the application
shinyApp(ui = ui, server = server)
我在这里使用一个玩具数据集(mtcars),但实际上,我想要过滤的内容没有固定的边界(除了是正整数之外)。使用上面的代码,当我输入有效值(例如 93)时,一切都会按预期工作。但是,对于 validate() 部分,即使我输入了有效值,也不会更新任何内容。我原来的应用程序是一个 2 寻呼机,第一页上有其他内容,所以这就是我在这里设置第一页的原因。与问题无关。
问题是我在 need() 中提出了错误的问题。 我刚刚替换为:
validate(need(!is.na(car_data()), "Choose a different HP."))
感谢上面的@YBS 为我指明了正确的方向。