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

nt5*_*t54 7 variables r

通过阅读官方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对象在被强制转换为符号之前是变量名?

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

MrF*_*ick 11

理解什么is.symbolis.name正在做什么很重要.首先,它们实际上是相同的功能.观察那个

is.symbol
# function (x)  .Primitive("is.symbol")
is.name
# function (x)  .Primitive("is.symbol")
Run Code Online (Sandbox Code Playgroud)

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

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

所以如果你这样做了

# rm(foo)   make sure it doesn't exist
is.name(foo)
# Error: object 'foo' not found
Run Code Online (Sandbox Code Playgroud)

你收到一个错误.尽管事实上这foo是一个名称本身,但它所指出的尚未定义.它试图"查找"的价值foo.观察那个

quote(foo)
# foo
is.name(quote(foo))
# [1] TRUE
Run Code Online (Sandbox Code Playgroud)

因此,quote将参数视为语言对象,您可以这样测试它.现在,如果我们定义foo指向一个名称

(foo <- as.name("hello"))
# hello
is.name(foo)
# [1] TRUE
Run Code Online (Sandbox Code Playgroud)

但如果我们把它指向别的东西

(foo <- "hello")
# [1] "hello"
is.name(foo)
# [1] FALSE
is.character(foo)
# [1] TRUE
Run Code Online (Sandbox Code Playgroud)

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

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