我有一个像下面这样的闪亮的应用程序,使用 diamonds
数据集为例。我使用两个selectInput作为数据过滤器。第一个选择一个变量。第二条显示数值,取决于第一个selectInput中选择的变量。选择后,点击actionButton来触发过滤器。在没有选择任何变量和值的情况下,我希望它输出整个数据集。
我发现当我清除了两个selectInput,然后点击actionButton后,我得到了错误。argument 1 is empty
. 我不明白为什么会发生这种情况。花了几个小时,但无法找到解决方案。有谁知道我怎么能解决这个问题吗? 非常感谢!我有一个像下面这样的闪亮的应用程序。
library(shiny)
library(shinydashboard)
library(dplyr)
library(rlang)
data(diamonds)
df = diamonds[1:1000,]
subset_data = function(data,
var=NULL,
value=NULL){
if (!is.null(var)) {
if(!is.null(value)) {
data = data %>% filter(!!sym(var) == value)
}
}
return(data)
}
ui <- dashboardPage(
dashboardHeader(title = "example"),
dashboardSidebar(),
dashboardBody(
fluidRow(
selectizeInput(inputId = 'var',
label='Select variable',
choices = c('cut', 'color'),
multiple=FALSE,
options = list(
maxItems = 1,
placeholder = '',
onInitialize = I("function() { this.setValue(''); }"))),
uiOutput("valueUI"),
actionButton('go', 'apply filter'),
tableOutput('table')
)
)
)
server <- function(input, output, session) {
output$valueUI = renderUI({
if (input$var == '') {
vals = ''
}
if (input$var == 'cut') {
vals = c('Premium', 'Good', 'Very Good', 'Fair')
}
if (input$var == 'color'){
vals = c('E', 'J', 'I', 'H')
}
selectizeInput(inputId = 'value',
label='Select values',
choices = c('',vals),
multiple=FALSE,
options = list(
maxItems = 1,
placeholder = '',
onInitialize = I("function() { this.setValue(''); }")))
})
dat = reactive({
input$go
isolate( subset_data(data=df, var=input$var, value=input$value) )
})
output$table <- renderTable({
dat()
})
}
shinyApp(ui, server)
如果 input$var
未给定,将用 ''
正如你所实现的那样。
但是,同时它也会给出参数 var
价值 subset_data
作为 ''
不 NULL
,所以它将不被识别与 !is.null(var)
和触发 filter
对于 data
.
如果你像下面的代码一样修改subset_data,你可以看到这些解释。
subset_data = function(data,
var=NULL,
value=NULL){
print('var:')
print(var) # var is given as ''
print("value:")
print(value)
if (!is.null(var)) {
if(!is.null(value)) {
print('hi')
data = data %>% filter(!!sym(var) == value)
print('hi2') # this will not printed, since filter makes error.
}
}
return(data)
}
所以在这种情况下,你可以通过在subset_data上添加一行来修正它们,以检查是否有 var == ''
.
if( var == '' ) return(data)
谢谢。