“和”之间有什么区别=&引用;及<-&引用;R?

“和”之间有什么区别=&引用;及<-&引用;R?,r,assignment-operator,r-faq,R,Assignment Operator,R Faq,赋值运算符=和之间有什么区别使用它们在函数调用中设置参数值时,它们之间的区别更为明显。例如: median(x = 1:10) x ## Error: object 'x' not found 在这种情况下,x是在函数的范围内声明的,因此它不存在于用户工作区中 median(x <- 1:10) x ## [1] 1 2 3 4 5 6 7 8 9 10 大多数R IDE都有键盘快捷键,使得谷歌的R风格指南通过禁止分配“=”简化了问题。这是个不错的选择

赋值运算符
=
之间有什么区别使用它们在函数调用中设置参数值时,它们之间的区别更为明显。例如:

median(x = 1:10)
x   
## Error: object 'x' not found
在这种情况下,
x
是在函数的范围内声明的,因此它不存在于用户工作区中

median(x <- 1:10)
x    
## [1]  1  2  3  4  5  6  7  8  9 10


大多数R IDE都有键盘快捷键,使得
谷歌的R风格指南通过禁止分配“=”简化了问题。这是个不错的选择

R手册详细介绍了所有5个赋值运算符


根据John Chambers的说法,操作员
=
只允许在“顶层”使用,这意味着在控制结构(如
if
)中不允许使用,从而导致以下编程错误非法

> if(x = 0) 1 else x
Error: syntax error
正如他所写,“在控制表达式中不允许新的赋值形式[=],可以避免编程错误(如上面的示例),与其他S赋值相比,使用equal运算符更容易出现这种错误。”

如果它“通过大括号或一对额外的圆括号与周围的逻辑结构隔离”,那么您可以设法做到这一点,因此
if((x=0))1,否则x
可以工作


请参见
x=y=5
相当于
x=(y=5)
,因为赋值运算符从右向左“分组”,这是有效的。含义:将5分配给
y
,保留数字5;然后将该5分配给
x

这与不起作用的
(x=y)=5不同!含义:将
y
的值赋给
x
,保留
y
的值;然后分配5给,嗯…,具体是什么


混合使用不同类型的赋值运算符时,
这也有助于理解这两种运算符之间的差异:

df <- data.frame(
      a = rnorm(10),
      b <- rnorm(10)
)
R版本3.3.2(2016-10-31);macOS Sierra 10.12.1



赋值运算符
=
之间的区别是什么
x意外赋值的缺点请注意,R认为任何非0都是
TRUE
。因此,如果要测试
x
是否小于
-y
,则可以编写
if(xi如果你确实禁止
=
并使用
为什么要用
伤害你的眼睛和手指这是一个常见的错误,
x==0
几乎总是意味着相反。啊,是的,我忽略了你说的“编程错误”。这实际上是个好消息,因为这会导致错误。这也是喜欢将
x=0
作为赋值而不是
xYes的一个很好的理由,这会导致错误,尽管我得出了不同的结论:我选择尽可能少地使用
=
,因为
=
=
看起来非常相似给出的示例对我来说太奇怪了。
if(x=0)1else x
抛出一个错误,帮助我发现并纠正一个bug。
if(x)我的意思是,一个真正有用的错误检查器会在那里抛出一个错误,并说“你有无用的代码,它总是返回
else
值,你是想这样写的吗?”,但是,这可能是一个白日梦……我认为“top-level”的意思是在语句级,而不是表达式级。因此
x这句话:“操作符=只允许在顶层使用”这是一个普遍存在的误解,也是完全错误的。这是不正确的——例如,尽管作业不是一个完整的表达:
1+(x=2)
为了澄清KonradRudolph和PavelMinaev的评论,我认为说这是完全错误的理由过于强烈,但有一个例外,那就是“通过大括号或额外的一对括号与周围的逻辑结构隔离。”或者在
function()x=1
repeat x=1
if(TRUE)x=1
…正如Patrick Burns在第8.2.26章中提到的
的起源(不是我,而是一个建议),然而,
中值((x=1:10))
具有与
中值相同的效果(X)我并没有真正考虑它们的快捷方式,在任何情况下,您按相同数量的KeSi只是意识到您对<代码> x的解释……并且我意识到这个答案的第一部分是不正确的,不幸的是,非常误导,因为它会导致一个常见的误解:在函数调用中使用<代码>=<代码>的方式。es不执行赋值,也不是赋值运算符。它是一个完全不同的解析R表达式,恰好使用相同的字符。此外,您显示的代码在函数范围内不“declare”
x
。函数声明执行上述声明。函数调用不(命名的
参数会变得更复杂一些)。您能更详细地解释为什么会发生这种情况/这里发生了什么吗?(提示:
data.frame
尝试使用提供的变量的名称作为数据框中元素的名称)我只是想,这可能是一个bug吗?如果是的话,我应该如何以及在哪里报告它?这不是bug。我试图在上面的评论中暗示答案。当设置元素的名称时,R将使用与
make.names(“b是的,正如的回答所说,
@Nick Dong确实是的。很有帮助的是,运算符precedence表在中被明确地记录了。关于优先级和R的文档中的错误,
的优先级实际上介于
=
@Moody\u mudscapper之间,这很奇怪!你似乎是对的,但根据源代码code(),
的优先级被正确记录,并且低于
=
我不会说C,但我认为
=
在构建解析树之前得到了特殊处理。可能与函数参数有关,在
foo(x=a?b)
中,我们应该寻找
=
library(formatR)
tidy_source(text = "x=1:5", arrow = TRUE)
## x <- 1:5
x <- 5
`<-`(x, 5)  #same thing

y = 5
`=`(y, 5)   #also the same thing
`<-`(x, `<-`(y, 5))
`<-`(x, `=`(y, 5))
`=`(`<-`(x, y), 5)
> if(x = 0) 1 else x
Error: syntax error
df <- data.frame(
      a = rnorm(10),
      b <- rnorm(10)
)
str(df)
# 'data.frame': 10 obs. of  2 variables:
#  $ a             : num  0.6393 1.125 -1.2514 0.0729 -1.3292 ...
#  $ b....rnorm.10.: num  0.2485 0.0391 -1.6532 -0.3366 1.1951 ...
…
‘-> ->>’           rightwards assignment
‘<- <<-’           assignment (right to left)
‘=’                assignment (right to left)
…
x
# Error: object 'x' not found
sum((x = 1), 2)
# [1] 3
x
# [1] 1
‹function_name›(‹argname› = ‹value›, …)
‹function_name›(‹args›, ‹argname› = ‹value›, …)
if (‹var› = ‹value›) …
while (‹var› = ‹value›) …
for (‹var› = ‹value› in ‹value2›) …
for (‹var1› in ‹var2› = ‹value›) …
median((x = 1 : 10))
if (! (nf = length(from))) return()