我正在尝试创建一个闪亮的应用程序,其中多条件过滤器中的代码依赖于用户输入。所以,如果"所有"选中后我们会看到所有内容,如果所选输入等于其他内容,我们只会看到该输入的数据。
if语句将代码插入到dplyr过滤器中。
我希望我能正确解释,如有任何帮助,请参阅以下代码:
服务器
library(dplyr)
library(ggplot2)
library(shiny)
shinyServer(function(input, output) {
raw <- diamonds
output$cutlist <- renderUI({
cutlist <- sort(unique(as.vector(raw$cut)), decreasing = FALSE)
cutlist <- append(cutlist, "All", after = 0)
selectizeInput("cutchoose", "Cut:", cutlist)
})
output$colorlist <- renderUI({
colorlist <- sort(unique(as.vector(raw$color)), decreasing = FALSE)
colorlist <- append(colorlist, "All", 0)
selectizeInput("colorchoose", "color:", colorlist)
})
output$table <- renderDataTable({
if(input$colorchoose == "All") {
filt1 <- quote(color != "@?><")
} else {
filt1 <- quote(color == input$colorchoose)
}
if (input$cutchoose == "All") {
filt2 <- quote(cut != "@?><")
} else {
filt2 <- quote(cut == input$cutchoose)
}
raw %>%
filter_(filt1) %>%
filter_(filt2)
})
})
UI
shinyUI(fluidPage(
# Application title
titlePanel("Dynamic Filter Test App"),
sidebarLayout(
sidebarPanel(
uiOutput("cutlist"),
uiOutput("colorlist")
),
mainPanel(
dataTableOutput("table")
)
)
))
控制台
Warning: Error in if: argument is of length zero
Stack trace (innermost first):
79: renderDataTable [D:\Independent Learning\R
code\dynamFilter/server.R#44]
78: func
77: origRenderFunc
76: output$table
1: runApp
答案 0 :(得分:1)
这对我有用:
output$table <- renderDataTable({
req(input$colorchoose)
req(input$cutchoose)
if(input$colorchoose == "All") {
filt1 <- quote(color != "@?><")
} else {
filt1 <- paste0("color == ","'",input$colorchoose,"'")
}
if (input$cutchoose == "All") {
filt2 <- quote(cut != "@?><")
} else {
filt2 <- paste0("cut == ","'",input$cutchoose,"'")
}
raw %>%
filter_(filt1) %>%
filter_(filt2)
})
开头的req语句可以防止对renderDataTable进行全面评估,直到输入正确初始化为止。第二个问题是输入变量似乎不在动态评估过滤器的范围内,因此我将语句更改为包含这些变量的值而不是其他名称。
答案 1 :(得分:0)
我曾经遇到过类似的错误。我认为原因是renderUI
表达式未必及时评估,以生成input
语句所需的if
值。由于renderUI
的{{1}}表达式中没有任何反应值,您可以将它们放在selectInput()
脚本中,并将其从ui
中删除脚本。
这对我有用:
server