通过官方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对象在被强制转换为符号之前是变量名?
感谢您帮助我们解决这一困惑。
答案 0 :(得分:11)
了解is.symbol
和is.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.name
和is.symbol
的工作方式。当你使用该语言编程时,它才真正有所作为。