我是初学者,所以我很感激任何想法,我明白这个问题可能对你们这些人来说太基本了。
此外,这个问题不是关于<-
和=
之间的区别,而是关于它们作为函数参数的一部分时的评估方式。我读了这个帖子,Assignment operators in R: '=' and '<-'和其他几个,但我无法理解其中的区别。
这是第一行代码:
我的目标是摆脱环境中的变量。从阅读上面的线程,我认为<-
将存在于用户工作区中,因此删除所有变量应该没有任何问题。
这是我的代码和两个问题:
问题1
首先,此代码不起作用。
rm(ls()) #throws an error
我相信这是因为ls()
返回一个字符向量,而rm()
需要一个对象名称。我对么?如果是这样,如果有人可以指导我如何从字符数组中获取对象名称,我将不胜感激。
问题2 我搜索了这个主题,发现下面的代码删除了所有变量。
rm(list = ls())
虽然这对我有帮助,但我不确定为什么使用=
代替<-
。如果我运行以下代码,则会收到错误Error in rm(list <- ls()) : ... must contain names or character strings
rm(list <- ls())
这是为什么?有人可以指导我吗?我很感激任何帮助/指导。
答案 0 :(得分:4)
我读过这个帖子,Assignment operators in R: '=' and '<-'和其他几个,但我无法理解其中的差异。
难怪,因为答案实际上很混乱,有些是完全错误的。既然如此,我们首先要确定它们之间的区别,然后再深入探讨实际问题(事实证明,这与大多数情况无关):
<-
是一个赋值运算符在R中,<-
是一个运算符,它在当前作用域中从右到左执行赋值。就是这样。
=
是赋值运算符或不同的语法标记 =
有几个含义:它的语义更改取决于它所使用的句法上下文:
如果在参数列表中使用=
,则紧靠参数名称的右侧,其含义为:“将右侧的值与左侧的参数名称相关联。” / p>
否则(即在所有其他情况下),=
也一个运算符,默认情况下与{{1>具有相同的含义}:即它在当前范围内执行赋值。
因此,运算符 <-
和<-
可以互换使用 1 。但是,=
在函数定义或函数调用的参数列表中具有额外的语法角色。在此上下文中,它不是运算符,不能被=
替换。
所以这些陈述都是等价的:
<-
请注意上一个示例中的额外括号:如果我们省略了这些,那么x <- 1
x = 1
x[5] <- 1
x[5] = 1
(x <- 1)
(x = 1)
f((x <- 5))
f((x = 5))
将被解释为参数关联而不是赋值。
有了这个,让我们转向你的第一个问题:
致电f(x = 5)
时,您将rm(ls())
作为ls()
参数传递给rm
。 Ronak的回答更详细地解释了这一点。
我的上述解释应该回答您的第二个问题:...
和<-
在此上下文中的行为有所不同,因为句法用法规定=
将rm(list = ls())
与ls()
关联起来参数list
,而<-
是(一如既往)一个赋值运算符。然后,该分配的结果将再次作为...
参数传递。
1 除非有人改变其含义:运算符与R中的所有其他函数一样,可以用新定义覆盖。
答案 1 :(得分:3)
要稍微扩展我的评论,请考虑以下示例:
> foo <- function(a,b) b+1
> foo(1,b <- 2) # Works
[1] 3
> ls()
[1] "b" "foo"
> foo(b <- 3) # Doesn't work
Error in foo(b <- 3) : argument "b" is missing, with no default
...
参数有一些特殊的东西会在OP的情况下进一步限制事情,但这说明了R如何解析函数参数的问题。
具体来说,当R查找名为的参数时,它会专门查找arg = val
,并带有等号。否则,它会在位置上解析参数。因此,当您省略第一个参数a
,然后只执行b <- 1
时,它认为表达式b <- 1
就是您为参数a
传递的内容。
答案 2 :(得分:2)
如果您选中?rm
rm(..., list = character(),pos = -1,envir = as.environment(pos), inherits = FALSE)
其中,
... - 要删除的对象,名称(未引用)或字符串(引用)。
和
list - 命名要删除的对象的字符向量。
所以,如果你这样做
a <- 5
然后
rm(a)
它将从全局环境中删除a
。
此外,如果您要删除多个对象,
a <- 5
b <- 10
rm(a, b)
这也可以写成
rm(... = a, b)
我们指定语法中的...
部分采用参数a
和b
同样,当我们想要指定语法的列表部分时,它必须由
给出rm(list = ls())
执行list <- ls()
会将ls()
中的所有变量存储在名为list
list <- ls()
list
#[1] "a" "b" "list"
我希望这会有所帮助。