gpt4 book ai didi

r - 为什么在不使用 x 的行上找不到 "object ' x' not found”?

转载 作者:行者123 更新时间:2023-12-04 11:27:11 24 4
gpt4 key购买 nike

我明白了:

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 是如何工作的,你......”,我将尝试创建一个最小的示例来重现问题。)

最佳答案

这是由 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

(我终于确认 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")

IE。它提示 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() .这反射(reflect)了原始问题中的代码,很容易看出这是如何令人困惑的:“我有一个 x 但它说它看不到一个!”。套用欧比旺的话:“这不是你要找的 x……”

关于r - 为什么在不使用 x 的行上找不到 "object ' x' not found”?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17310807/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com