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

如何在执行do.call前提前获取gbm函数的调用语句?

提前生成do.call对应的函数调用语句的方法

可以通过构造call对象来实现,无需先执行do.call就能拿到完整的函数调用语句,具体操作如下:

  • 用call()函数直接构造调用表达式:第一个参数传入函数名(字符串或符号),后续依次传入参数列表中的键值对;或者用as.call()将c(函数名, 参数列表)转换为调用表达式。
  • 先打印这个call对象,即可看到和do.call执行时完全一致的调用语句。
  • 最后用eval()执行这个call对象,效果和do.call完全相同。

示例1:参数正常的情况

lstParams <- list()
lstParams$formula <- as.formula("Sepal.Length ~ Sepal.Width + Petal.Length")                          
lstParams$data <- substitute(iris)
lstParams$distribution <- "bernoulli"

# 提前生成调用语句,两种方式二选一
# 方式1:手动指定参数
gbm_call <- call("gbm", formula = lstParams$formula, data = lstParams$data, distribution = lstParams$distribution)
# 方式2:基于参数列表自动生成,更高效
# gbm_call <- as.call(c(list(quote(gbm)), lstParams))

# 打印调用语句用于调试
print(gbm_call)
# 输出:gbm(formula = Sepal.Length ~ Sepal.Width + Petal.Length, data = iris, distribution = "bernoulli")

# 执行调用
mdl <- eval(gbm_call)

示例2:参数错误的情况

lstParams <- list()
lstParams$formula <- as.formula("Sepal.Length ~ Sepal.Width + Petal.Lengthx")                         
lstParams$data <- substitute(iris)
lstParams$distribution <- "bernoulli"

# 提前生成并打印调用语句
gbm_call <- as.call(c(list(quote(gbm)), lstParams))
print(gbm_call)
# 输出:gbm(formula = Sepal.Length ~ Sepal.Width + Petal.Lengthx, data = iris, distribution = "bernoulli")

# 执行时即使报错,已提前拿到调用语句用于排查问题
mdl <- eval(gbm_call)
# Error in eval(predvars, data, env) : object 'Petal.Lengthx' not found

补充说明

  • 使用quote(gbm)生成符号对象作为函数名,打印出的调用语句更接近日常编写的代码格式;用字符串"gbm"也能实现相同功能。
  • 当参数列表较长时,as.call(c(list(quote(函数名)), 参数列表))的方式无需手动逐个传入参数,效率更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 05:05:09