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

如何将R Shiny响应式表达式作为自定义函数的默认参数?

解决Shiny中自定义函数默认参数引用input的报错问题

报错原因

你遇到的promise already under evaluation: recursive default argument reference or earlier problems?错误,根源出在自定义函数的参数定义上:

  • 函数参数名设为input,同时默认值写了input$myInput,R解析时会认为是递归引用参数本身,触发错误
  • 函数定义阶段,Shiny的input对象还未在函数的作用域内,无法直接引用

修正方案

  1. 避免在函数默认参数中直接引用Shiny的input对象,改为调用时显式传入参数值
  2. 修改函数参数名,避免和Shiny内置的input对象同名,减少代码混淆

修正后的完整代码

library(shiny)
library(DT)

# 自定义函数:修改参数名为input_val,去掉默认值
my_DTarguments <- function(data, input_val) {
  DT::datatable(
    rownames = FALSE,
    data,
    extensions = 'Buttons',
    options = list(
      dom = 'frtipB',
      buttons = list(
        list(
          extend = 'csv',
          filename = paste0("mydesiredname-", "cyl-", input_val, "-", Sys.Date())
        )
      )
    )
  )
}

shinyApp(
  ui = fluidPage(
    textInput(inputId = "myInput", label = "My Input", placeholder = "a"),
    DT::dataTableOutput("table")
  ),
  
  server = function(input, output) {
    # 绑定mtcars与输入框内容
    mtcars1 <- reactive({ 
      cbind(mtcars, input$myInput)
    })
    
    # 调用函数时显式传入input$myInput
    output$table <- DT::renderDataTable(
      my_DTarguments(mtcars1(), input_val = input$myInput)
    )
  }
)

关键修改点

  • 函数参数从input改为input_val,消除命名冲突,同时去掉默认参数,强制调用时传入具体值
  • 修正ShinyApp的语法错误:原代码中shinyApp(ui <- ..., server <- ...)的赋值写法不符合规范,改为ui = ..., server = ...;同时修正了server函数末尾多余的闭合括号
  • 在renderDataTable中调用my_DTarguments时,显式传入input_val = input$myInput,确保Shiny的响应式上下文能正确传递输入值

内容的提问来源于stack exchange,提问作者TarJae

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 03:45:27