“和”之间有什么区别=&引用;及<-&引用;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()