Shiny应用中用input$sel作为detect_value_range_violations参数报错
解决Shiny中动态传递参数给detect_value_range_violations的问题
你遇到的问题是无法直接将input$sel作为参数名传递给detect_value_range_violations,因为R会将input$sel当作字面量参数名,而非解析它的实际值。要实现动态切换参数(lifecycle或qty),需要通过动态构建命名参数列表的方式传递,以下是两种可行方案:
方案1:使用do.call构建参数调用
修改server中的valuerange reactive对象:
server <- function(input, output) { valuerange<-reactive({ # 构建动态参数列表:参数名为input$sel的取值,值为domain_numeric规则 params <- list( .data = act, !!input$sel := domain_numeric(from = 0, to = 5) ) # 用do.call调用函数并传递参数 do.call(detect_value_range_violations, params) }) }
方案2:使用rlang的!!!展开参数
利用set_names给规则列表设置动态名称,再通过!!!将其展开为函数的命名参数:
server <- function(input, output) { valuerange<-reactive({ act %>% detect_value_range_violations( !!!set_names( list(domain_numeric(from = 0, to = 5)), input$sel ) ) }) }
完整修改后的app代码
library(shiny) library(shinydashboard) library(shinydashboardPlus) library(daqapo) library(rlang) # 方案2需要加载rlang包 act<-structure(list(lifecycle = c(3, 3, 1, 1, 2, 2, 6, 6, 4, 4, 5, 5), qty = c(31, 31, 31, NA, 9, 31, 28, 28, 6, 6, 3, 3)), row.names = c(NA, -12L), class = c("activitylog", "log", "tbl_df", "tbl", "data.frame" ), case_id = "case_id", activity_id = "activity", resource_id = "resource", timestamps = c("start", "complete")) ui <- dashboardPage( dashboardHeader(), dashboardSidebar( selectInput("sel","Select",choices = colnames(act),selected = colnames(act)[1],multiple = F) ), dashboardBody() ) server <- function(input, output) { valuerange<-reactive({ # 这里任选一种方案即可 # 方案1:do.call # params <- list( # .data = act, # !!input$sel := domain_numeric(from = 0, to = 5) # ) # do.call(detect_value_range_violations, params) # 方案2:!!!展开 act %>% detect_value_range_violations( !!!set_names(list(domain_numeric(from = 0, to = 5)), input$sel) ) }) } shinyApp(ui, server)
说明
- 两种方案都能实现根据
input$sel的选择,动态将规则应用到lifecycle或qty列 - 方案2需要加载
rlang包(daqapo可能已依赖它,但显式加载更稳妥) - 确保
selectInput的choices仅包含目标列名,避免无效参数传递
内容的提问来源于stack exchange,提问作者firmo23
相关产品推荐
相关产品推荐

