R 内部函数从外部函数提取调用并导致错误
我正在使用库中的一个函数在另一个函数中跳跃。所讨论的leaps函数的最后两行是:R 内部函数从外部函数提取调用并导致错误,r,scope,R,Scope,我正在使用库中的一个函数在另一个函数中跳跃。所讨论的leaps函数的最后两行是: rval$call <- sys.call(sys.parent()) rval 因此,best$call将包含对外部函数(test)的调用,而不是对内部(regsubsets)函数的调用。因为改变内部函数并不是一个真正的选择,有没有办法避免这个问题 编辑: 解决问题的一种方法可能是: test <- function(dependent, data){ thecall <- 'regsu
rval$call <- sys.call(sys.parent())
rval
因此,best$call
将包含对外部函数(test
)的调用,而不是对内部(regsubsets
)函数的调用。因为改变内部函数并不是一个真正的选择,有没有办法避免这个问题
编辑:
解决问题的一种方法可能是:
test <- function(dependent, data){
thecall <- 'regsubsets(as.formula(paste0(dependent, " ~ .")), data = data, nvmax = 2)'
best.fit <- eval(parse(text = thecall))
#best.fit$call <- [some transformation of thecall
return(best.fit)
}
test我还不完全清楚如何使用它,但是对于test
函数,您可以编写以下代码:
test = function (dependent, data) {
regsubsets_call = bquote(regsubsets(.(as.formula(paste0(dependent, " ~ ."))),
data = .(substitute(data)), nvmax = 2))
best_fit = eval(regsubsets_call)
best_fit$call = regsubsets_call
best_fit
}
但是,结果可能无法与包提供的下游函数一起工作(尽管实际上,它可能会工作;我猜summary.regsubsets
仅使用它打印调用)
这是怎么回事?
bquote
构造一个未赋值的R表达式;它类似于quote
,但允许您插入值(类似于substitute
)substitute(data)
意味着,不是将实际的data.frame
放入调用中(这将导致非常笨拙的输出),而是将用户传递给test的变量名(或表达式)
。因此,如果用户将其称为test('mpg',mtcars)
,则生成的表达式将是
regsubsets(mpg ~ ., data = mtcars, nvmax = 2)
然后,(a)通过eval
对生成的调用对象进行评估,(b)存储在生成的$call
中
顺便说一句,公式可以(而且,就我而言,应该)以相同的方式构造;无需解析字符串:
as.formula(bquote(.(as.name(dependent)) ~ .))
综合起来,整个表达式将变成:
formula = as.formula(bquote(.(as.name(dependent)) ~ .))
regsubsets_call = bquote(regsubsets(.(formula), data = .(substitute(data)), nvmax = 2))
问题是什么?据我所知,一切都是按预期的方式进行的。问题是best$调用应该包含regsubset(As.formula(paste0(dependent,“~”),data=data,nvmax=2),而不是test(“dep”,dfk)我的观点是:是什么让你认为它应该包含一些东西而不是它包含的东西?代码对此非常明确,并且(没有看过包的代码)这不是不合理的。我并不是说它在更广泛的意义上是错误的或不合理的。我是说$call将包含不同的内容,这取决于regsubset函数是在函数内部还是外部执行的。我的代码将因此无法工作。谢谢,这确实有效。我正在使用它来获得交叉验证错误s,以评估一组独立变量的任何滞后顺序是否有助于预测集合中的任何一个因变量。因此,我手动创建了一个CV循环(来自ISLR一书),因此需要使用n个回归器从最佳函数中获得预测值。
as.formula(bquote(.(as.name(dependent)) ~ .))
formula = as.formula(bquote(.(as.name(dependent)) ~ .))
regsubsets_call = bquote(regsubsets(.(formula), data = .(substitute(data)), nvmax = 2))