You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 18:50:38