在 R 中,为什么 rm(list<-ls()) 在 <- 也是赋值时不起作用?

  • 本文关键字:赋值 不起作用 -ls rm list r
  • 更新时间 :
  • 英文 :


根据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()分配给函数的参数listrm()

rm()的第一个参数是...,它必须是字符串或要删除的变量的名称。您传递list <- ls()既不是字符串也不是名称,这就是您收到错误的原因。如果要在rm()中将ls()传递给list参数,则需要使用=,而不是<-

最新更新