如何将R Shiny响应式表达式作为自定义函数的默认参数?
解决Shiny中自定义函数默认参数引用input的报错问题
报错原因
你遇到的promise already under evaluation: recursive default argument reference or earlier problems?错误,根源出在自定义函数的参数定义上:
- 函数参数名设为
input,同时默认值写了input$myInput,R解析时会认为是递归引用参数本身,触发错误 - 函数定义阶段,Shiny的
input对象还未在函数的作用域内,无法直接引用
修正方案
- 避免在函数默认参数中直接引用Shiny的
input对象,改为调用时显式传入参数值 - 修改函数参数名,避免和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
相关产品推荐
相关产品推荐

