7

我明白了:

Error in paste0(width, on, k) : object 'x' not found

我完全困惑为什么它在这条特定的行上抱怨“x”!

on是字符,widthk数字。x存在(它是这个函数的一个参数)。该行和前面的行看起来像:

print(index(x))
stopifnot(length(index(x))>=1)
#str(on);str(k);str(width)
extra=list( paste0(width,on,k) )

但更奇怪的是,当我添加注释掉的行时,它反而抱怨:

Error in str(on) : object 'x' not found

触发这个问题的原因是我添加了这行代码:

rm(x)

rm(list=c("x"))给出相同的行为。)

所以,我期待一个“x not found”错误。但不在该行(甚至不在该函数中)!

背景:我发现了一个错误,其中代码依赖于一个名为 的全局变量x,该变量应该作为参数传递。它在单元测试中有效,在实际代码中失败,因为有问题的变量在实际代码中没有被称为“x”!!因此,我决定在完成每个变量后显式删除它,以发现我是否还有此类错误。

(如果上面的代码片段不足以让某人去“啊哈,达伦,你仍然不明白 R 是如何工作的……”,我将尝试创建一个最小的示例来重现该问题。)

4

1 回答 1

4

这是由于x被用来为函数调用制作参数之一引起的。这是一个最小的示例:

f=function(d,on){ print(on) } #AAA

x=1:4
attr(x,'extra')=list(a=1,b="xxx")
d=mean(x)

rm(x)   #Not needed any more

f(d, attr(x,'extra') )  # BBB

它给出了#AAA 行的错误(见下文),而不是#BBB,如您所料。

这是因为attr是一个原始函数。见http://cran.r-project.org/doc/manuals/r-release/R-lang.html#Builtin-objects-and-special-forms

(我终于确认原始函数的工作方式与承诺对象相同,即延迟执行:http ://cran.r-project.org/doc/manuals/R-ints.html#Argument-evaluation )


我得到的错误如下:

Error in print(on) : object 'x' not found
6: print(on) at dummy.R#1
5: f(d, (attr(x, "extra"))) at dummy.R#9
4: eval(expr, envir, enclos)
3: eval(ei, envir)
2: withVisible(eval(ei, envir))
1: source("dummy.R")

即它抱怨x不存在于第 1 行,而不是第 9 行。您可以使函数f更大,on直到函数更深入时才使用,甚至将其传递给另一个函数,并且在on实际必须评估之前确实会触发错误。例如这个更长的例子:

g=function(x,on){
    cat("Something else:",x,"\n")
    print(on)
}

f=function(d,on){
    cat("Do something:",d,"\n")
    g(d,on)
}

x=1:4
attr(x,'extra')=list(a=1,b="xxx")
d=mean(x)

rm(x)   #Not needed any more

f(d, (attr(x,'extra')) )

为了给这个例子增添趣味,我还添加了一个名为xto的参数g()。这反映了原始问题中的代码,很容易看出这可能会造成混淆:“我有一个 x,但它说它看不到一个!”。套用欧比旺的话说:“这不是x你要找的……”

于 2013-06-27T08:13:11.797 回答