为什么在不使用x的行上找不到“object”x'?
我得到这个:
Error in paste0(width, on, k) : object 'x' not found
我完全困惑,为什么它在这个特定的行上抱怨'x'!
on
是一个字符, width
和k
是数字。 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'! 所以,我决定在完成后明确地删除每个变量,以发现是否还有更多此类错误。
(如果上面的代码片段不足以让某个人去“Aha,Darren,你仍然不知道R是如何工作的......”,我会尝试创建一个最小范例来重现此问题。)
这是由于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
是一个Primitive函数。 请参阅http://cran.r-project.org/doc/manuals/r-release/R-lang.html#Builtin-objects-and-special-forms
(我最终发现确认Primitive函数的工作方式与promise对象相同,即延迟执行: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')) )
为了增加这个例子,我还添加了一个名为x
的参数给g()
。 这反映了原始问题中的代码,很容易看出这会令人困惑:“我有一个x,但它说它看不到一个!”。 解释欧比旺:“这不是你要找的x
......”
上一篇: Why "object 'x' not found" on a line that does not use x?