如何在执行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
相关产品推荐
相关产品推荐

