RStudio 和惰性求值

RStudio and Lazy Evaluation

我正在维护包 "hdm",我遇到了以下问题。 以下代码 运行s 在纯 R 中,在 RStudio 中用于 运行,但不再是:

library(hdm)
attach(GrowthData)
fmla=  "Outcome ~ ."
fmla.y= "Outcome ~ . - gdpsh465 "
rY= rlasso(fmla.y, data =GrowthData)

错误信息:

Error in exists("homoscedastic", where = penalty) : object 'n' not found

如果在函数 rlasso 中没有指定惩罚,则默认设置包含变量 "n",x 的样本大小,稍后对其进行评估。 n 是通过惰性评估获得的,似乎在 RStudio 中找不到正确的环境。

这里出现错误,问题是penalty中包含n,不知道

if (!exists("homoscedastic", where = penalty))  penalty$homoscedastic = "FALSE"

不知道怎么解决这个问题,想问问大家有什么想法。

非常感谢您提前的努力!

最佳,

马丁

x是字符object时,问题出现是因为n在调用rlasso.formula的环境中没有定义,即rlasso.character(),或其 parents。大致情况如下:

test <- function(x, ...) {
  UseMethod("test")
}
test.character <- function(x, pen = list(alpha = n)) {
  test.formula(x, pen = pen)
}
test.formula <- function(x, pen = list(alpha = n)) {
  n <- 2
  test.default(x, pen)
}
test.default <- function(x, pen = list(alpha = n)) {
  n <- 3
  exists("alpha", where = pen)
}

test("y ~ x")
# Error in exists("alpha", where = pen) : object 'n' not found
test(y ~ x)
# [1] TRUE
test(123)
# [1] TRUE

解决方法是在调用 formula 方法时不指定 pen,如果在调用 character 方法时未定义它:

test.character <- function(x, pen = list(alpha = n)) {
    if (missing(pen))
      test.formula(x)
    else
      test.formula(x, pen = pen)
}
test("y ~ x")
# [1] TRUE