r - 为什么缺少的功能在反应式 RShiny 中不起作用?
问题描述
我有一个 R 闪亮的应用程序,它过滤一些变量并使用模块返回一个表。我想使用missing()
以便即使没有为模块提供任何值,该应用程序仍然可以工作。但是,当我missing()
在里面使用reactive()
它时会报错:Warning: Error in missing: 'missing' can only be used for arguments
. 有谁知道为什么会这样?有没有办法解决这个问题?
示例应用程序:
df <- data.frame(a = sample(letters,100,T), b = sample(10,100,T))
dfFilter <- function(data, a, b){
if (!missing(a)) {
if(!is.null(a)){
data <- data[data$a %in% a,]
}
}
if (!missing(b)) {
if(!is.null(b)){
data <- data[data$b %in% b,]
}
}
return(data)
}
filterTable <- function(input, output, session, data, aFetcher, bFetcher){
return(reactive(dfFilter(data = data,
a = switch(!missing(aFetcher),
aFetcher(),NULL),
b = switch(!missing(bFetcher),
bFetcher(), NULL))))
}
displayTableUI <- function(id){
ns <- NS(id)
DT::dataTableOutput(ns('displayer'))
}
displayTable <- function(input, output, session, data){
output$displayer <- DT::renderDataTable(data())
}
chooserUI <- function(id){
ns <- NS(id)
uiOutput(ns('filter'))
}
chooseA <- function(input, output, session, data){
output$filter <- renderUI({
ns <- session$ns
pickerInput(inputId = ns('filter'),
label = 'Choose A:',
choices = unique(data$a),
options = list(`actions-box` = TRUE),
multiple = TRUE)
})
return(reactive(input$filter))
}
chooseB <- function(input, output, session, data){
output$filter <- renderUI({
ns <- session$ns
pickerInput(inputId = ns('filter'),
label = 'Choose B:',
choices = unique(data$b),
options = list(`actions-box` = TRUE),
multiple = TRUE)
})
return(reactive(input$filter))
}
ui <- fluidPage(
tabPanel('data',
sidebarPanel(
chooserUI('aChooser'),
chooserUI('bChooser')
),
mainPanel(
displayTableUI('table1')
)
)
)
server <- function(input,output){
chosenA <- callModule(chooseA,
id = 'aChooser',
data = df)
chosenB <- callModule(chooseB,
id = 'bChooser',
data = df)
table1 <- callModule(filterTable,
data = df,
id = 'tableFilterer',
aFetcher = chosenA,
bFetcher = chosenB)
callModule(displayTable, id = 'table1', data = table1)
}
shinyApp(ui, server)
解决方案
通过使用exists()
而不是修复!missing()
:
df <- data.frame(a = sample(letters,100,T), b = sample(10,100,T))
dfFilter <- function(data, a, b){
if (!missing(a)) {
if(!is.null(a)){
data <- data[data$a %in% a,]
}
}
if (!missing(b)) {
if(!is.null(b)){
data <- data[data$b %in% b,]
}
}
return(data)
}
filterTable <- function(input, output, session, data, aFetcher, bFetcher){
return(reactive(dfFilter(data = data,
a = switch(exists(aFetcher),
aFetcher(),NULL),
b = switch(exists(bFetcher),
bFetcher(), NULL))))
}
displayTableUI <- function(id){
ns <- NS(id)
DT::dataTableOutput(ns('displayer'))
}
displayTable <- function(input, output, session, data){
output$displayer <- DT::renderDataTable(data())
}
chooserUI <- function(id){
ns <- NS(id)
uiOutput(ns('filter'))
}
chooseA <- function(input, output, session, data){
output$filter <- renderUI({
ns <- session$ns
pickerInput(inputId = ns('filter'),
label = 'Choose A:',
choices = unique(data$a),
options = list(`actions-box` = TRUE),
multiple = TRUE)
})
return(reactive(input$filter))
}
chooseB <- function(input, output, session, data){
output$filter <- renderUI({
ns <- session$ns
pickerInput(inputId = ns('filter'),
label = 'Choose B:',
choices = unique(data$b),
options = list(`actions-box` = TRUE),
multiple = TRUE)
})
return(reactive(input$filter))
}
ui <- fluidPage(
tabPanel('data',
sidebarPanel(
chooserUI('aChooser'),
chooserUI('bChooser')
),
mainPanel(
displayTableUI('table1')
)
)
)
server <- function(input,output){
chosenA <- callModule(chooseA,
id = 'aChooser',
data = df)
chosenB <- callModule(chooseB,
id = 'bChooser',
data = df)
table1 <- callModule(filterTable,
data = df,
id = 'tableFilterer',
aFetcher = chosenA,
bFetcher = chosenB)
callModule(displayTable, id = 'table1', data = table1)
}
shinyApp(ui, server)
推荐阅读
- arrays - 使用 $elemMatch 和 $arrayFilters 在嵌套数组中推送对象
- mysql - 多个 date_format 转换
- ios - 在结构运行时更改属性的名称
- javascript - 在 1 个 ES6 模块中封装多个 JavaScript 文件的好习惯是什么?
- jquery - 如何重置语义UI表单?
- php - 如何使用 MySQL 表生成调查表?
- linux - 管道pyinstaller输出可能吗?
- python - Selenium - 使用用户界面编辑代码
- javascript - 如何将背景图像应用到某些 HTML 按钮并让图像从上次停止的地方继续?
- batch-file - 将匹配文件的列表输出到 .txt 然后移动文件,使用 txt 稍后将文件返回到原始文件夹