R变量名称:符号/名称或其他东西?

时间:2014-08-11 02:47:02

标签: r variables

通过官方R文档以及一些贡献的教程,我们了解到变量名称被视为语言对象 - 即它们是符号,即名称。

在p。 Symbol LookUp标题下的R语言定义手册(版本3.1.1)中的14个是一个简单示例:"y <- 4 ... y is a symbol and 4 is its value"。令人困惑的是,is.symbol(y)或等效is.name(y)返回FALSE(对于引用和不带引号的参数y)。当一个人将变量强制转换为带有y <- as.name(4)的符号时,is.symbol(y)is.name(y)会返回TRUE。因此,变量名称似乎不是符号/名称,直到它们被强制转换为符号/名称。什么类型的R对象在被强制转换为符号之前是变量名?

感谢您帮助我们解决这一困惑。

1 个答案:

答案 0 :(得分:11)

了解is.symbolis.name正在做什么非常重要。首先,它们实际上是相同的功能。观察

is.symbol
# function (x)  .Primitive("is.symbol")
is.name
# function (x)  .Primitive("is.symbol")

所以R中的符号/名称实际上是相同的。所以这里我将使用is.name

但是请注意,这些函数正在检查您传递的名称指向的“事物”是符号还是名称。他们正在查找名称所指的内容。

所以如果你做了

# rm(foo)   make sure it doesn't exist
is.name(foo)
# Error: object 'foo' not found
你得到一个错误。尽管foo本身就是一个名称,但它所指出的内容尚未定义。它试图“查找”foo的值。观察

quote(foo)
# foo
is.name(quote(foo))
# [1] TRUE

因此quote会将参数视为语言对象,您可以通过这种方式对其进行测试。现在,如果我们将foo定义为指向名称

(foo <- as.name("hello"))
# hello
is.name(foo)
# [1] TRUE

但如果我们将其指向别的东西

(foo <- "hello")
# [1] "hello"
is.name(foo)
# [1] FALSE
is.character(foo)
# [1] TRUE

然后它不再指向名称(这里,它指向一个字符)

因此变量名称是名称/符号,但通常大多数R函数将与它们指向的内容一起使用,而不是返回有关名称本身的信息。所以问题是你误解了is.nameis.symbol的工作方式。当你使用该语言编程时,它才真正有所作为。