为什么在不使用x的行上找不到“object”x'?

我得到这个:

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'! 所以,我决定在完成后明确地删除每个变量,以发现是否还有更多此类错误。

(如果上面的代码片段不足以让某个人去“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 ......”

链接地址: http://www.djcxy.com/p/72283.html

上一篇: Why "object 'x' not found" on a line that does not use x?

下一篇: java Scanner reads only first 2048 bytes