'='与'< - '作为R中的函数参数

时间:2017-01-30 05:27:58

标签: r

我是初学者,所以我很感激任何想法,我明白这个问题可能对你们这些人来说太基本了。

此外,这个问题不是关于<-=之间的区别,而是关于它们作为函数参数的一部分时的评估方式。我读了这个帖子,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())  

这是为什么?有人可以指导我吗?我很感激任何帮助/指导。

3 个答案:

答案 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)

我们指定语法中的...部分采用参数ab

同样,当我们想要指定语法的列表部分时,它必须由

给出
rm(list = ls())

执行list <- ls()会将ls()中的所有变量存储在名为list

的变量中
list <- ls()

list
#[1] "a"    "b"    "list"

我希望这会有所帮助。