根据R手册,
运算符 <- 可以在任何地方使用,而运算符 = 只允许在顶层使用(例如,在命令提示符下键入的完整表达式中(
所以我尝试了 rm(list<-ls(((,因为如上所述<-运算符可以在任何地方使用,但 R 给了我一个错误说"......必须包含名称或字符串"。
rm(list=ls((( 工作没有任何问题。据我所知,<-是一个更通用的赋值,而=可以在更严格的情况下使用。但是为什么使用 <- 会在"rm"功能方面出错?
这是因为rm()
默认使用非标准评估。它尝试删除您为未list=
(或pos=
或env=
或inherits=
(的参数从字面上键入的内容。
所以你可以做
a <- 10
rm(a)
请注意,a
只是被解释为一个符号。不计算返回值。当您调用rm(list<-ls())
时,您希望计算该表达式,但事实并非如此。它试图找到一个名为"list<-ls()"
的变量,但不存在这样的变量,因为任何变量都不应该有这样的名称。此外,它必须是"有效"的变量名称。从?make.names
帮助页面
语法上有效的名称由字母、数字和点或下划线字符组成,以字母或点开头,后不跟数字
这意味着它不会解析不寻常的变量名称,就像您可以通过转义带有反引号或单引号的符号所做的那样。从技术上讲,你也可以做
a <- 10
rm("a")
因为非标准评估会检查参数是否为文字字符值。但它仍然不会计算任何表达式,即使它们最终会返回字符值。例如
a <- 10
b <- "a"
rm(b)
上面发生的事情是b
被删除,而不是a
。
如果要传入一个以 stirngs 形式返回变量名称的函数(如ls()
所示(,则需要使用命名的list=
参数。<-
运算符不能替代命名参数的=
。
您正在读取赋值操作的条目,而在rm(list = ls()
的情况下,=
不用作赋值运算符,而是用于在函数调用中设置参数值(请参阅此堆栈溢出答案中的讨论(。
让我们举一个例子来说明:
formals(print)
#> $x
#>
#>
#> $...
# The first argument to print() is named x
print(x = "a")
#> [1] "a"
# We've only set the value of argument x, not assigned to x
x
#> Error in eval(expr, envir, enclos): object 'x' not found
print(x <- "a")
#> [1] "a"
# Now we've assigned to x, and passed x as the first argument to print
x
#> [1] "a"
print(y <- "b")
#> [1] "b"
# It works with any variable name, since R can take variables by name or order
y
#> [1] "b"
创建于 2018-10-08 由 reprex 软件包 (v0.2.1(
更新
阿利斯泰尔对这个问题发表了很好的评论,同时我回答说你也应该阅读。
<-
不是更普遍的。它仅适用于分配。=
有两个用途:赋值和参数传递。在函数内部,=
执行参数分配,这是您在此处要执行的操作。使用=
,您不会创建一个值为ls()
的变量list
;您正在将参数ls()
分配给函数的参数list
rm()
。
要rm()
的第一个参数是...
,它必须是字符串或要删除的变量的名称。您传递list <- ls()
既不是字符串也不是名称,这就是您收到错误的原因。如果要在rm()
中将ls()
传递给list
参数,则需要使用=
,而不是<-
。