RStudio与惰性评价

RStudio与惰性评价,r,rstudio,lazy-evaluation,R,Rstudio,Lazy Evaluation,我正在维护程序包“hdm”,遇到以下问题。 以下代码在普通R中运行,并用于在RStudio中运行,但不再是: library(hdm) attach(GrowthData) fmla= "Outcome ~ ." fmla.y= "Outcome ~ . - gdpsh465 " rY= rlasso(fmla.y, data =GrowthData) 错误消息: 存在错误(“同调”,其中=惩罚):对象“n”不存在 发现 如果未指定函数rlasso中的惩罚,则默认情况下会设置该函数,其中包含

我正在维护程序包“hdm”,遇到以下问题。 以下代码在普通R中运行,并用于在RStudio中运行,但不再是:

library(hdm)
attach(GrowthData)
fmla=  "Outcome ~ ."
fmla.y= "Outcome ~ . - gdpsh465 "
rY= rlasso(fmla.y, data =GrowthData)
错误消息:

存在错误(“同调”,其中=惩罚):对象“n”不存在 发现

如果未指定函数rlasso中的惩罚,则默认情况下会设置该函数,其中包含变量“n”,即样本大小x,稍后将对其进行计算。 n是通过延迟求值得到的,在RStudio中似乎再也找不到正确的环境

错误发生在这里,但问题是惩罚包含不知道的n

if (!exists("homoscedastic", where = penalty))  penalty$homoscedastic = "FALSE"
不知何故,我不确定是否能解决这个问题,我想问你是否有任何想法

非常感谢您提前付出的努力

最好的


Martin

x
是字符对象时,出现问题的原因是
n
未在调用
rlasso.formula
的环境中定义,即
rlasso.character()
或其父对象。这大概就是正在发生的事情:

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

我在R中也遇到了同样的错误,因此这不仅仅是RStudio问题。在以下R配置下,它可以工作:sessionInfo()R版本3.3.1(2016-06-21)平台:x86_64-w64-mingw32/x64(64位),运行于:Windows 10 x64(build 16299)语言环境:[1]LC_COLLATE=German_German.1252 LC_CTYPE=German_German.1252[3]LC_MONETARY=German_Germany.1252 LC_NUMERIC=C[5]LC_TIME=German_Germany.1252附加的基本包:[1]统计图形grDevices utils数据集方法基本其他附加包:[1]通过命名空间加载的hdm_0.2.3(未附加):[1]backports\u 1.0.3工具\u 3.3.1将死\u 1.8.1公式\u 1.2-1真是奇怪。它以前工作过,但最近出现了错误。R进行惰性计算,在计算时,n在此不再为人所知。我认为问题在很久以前就出现了。也许可以提前对处罚进行评估。我不确定。
rlasso(output~.-gdpsh465,data=GrowthData)
有效,但不是
rlasso(“output~.-gdpsh465,data=GrowthData)
。非常感谢!它似乎解决了这个问题(尽管我仍然感到困惑,因为在plain R中它是有效的,并且只有在RStudio中才出现错误)。对此有什么想法吗?在plain R中,无论是在v3.4.3还是在v3.3.1中,它都不适用于我。我不认为这是一个RStudio问题。非常感谢你的努力!我仍然感到困惑。
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