문제

과제 연산자의 차이점은 무엇입니까? = 그리고 <- R에서?

이 예제가 보여 주듯이 운영자가 약간 다르다는 것을 알고 있습니다.

x <- y <- 5
x = y = 5
x = y <- 5
x <- y = 5
# Error in (x <- y) = 5 : could not find function "<-<-"

그러나 이것이 유일한 차이점입니까?

도움이 되었습니까?

해결책

과제 연산자의 차이점은 무엇입니까? = 그리고 <- R에서?

예제가 보여 주듯이 = 그리고 <- 연산자 우선 순위가 약간 다릅니다 (동일한 표현식으로 혼합 될 때 평가 순서를 결정합니다). 사실로, ?Syntax r에서 r은 다음 연산자 우선 순위 테이블을 가장 높은 것에서 가장 낮게 제공합니다.

…
‘-> ->>’           rightwards assignment
‘<- <<-’           assignment (right to left)
‘=’                assignment (right to left)
…

그러나 이것이 유일한 차이점입니까?

당신이 묻고 있었기 때문에 과제 연산자: 그렇습니다. 그것이 유일한 차이입니다. 그러나, 당신은 그렇지 않다고 믿는 것에 대해 용서받을 것입니다. R 문서조차도 ?assignOps 더 많은 차이점이 있다고 주장합니다.

연산자 <- 연산자는 어디서나 사용할 수 있습니다 = 최상위 수준 (예 : 명령 프롬프트에 입력 한 완전한 표현식) 또는 브레이스 표현식 목록의 하위 표현 중 하나로 만 허용됩니다.

너무 잘 지적하지 마십시오. R 문서는 (미묘하게) 잘못되었습니다 [1]. 이것은 쉽게 보여줄 수 있습니다 : 우리는 단지 = (a) 최상위 수준에 있거나 (b) 브레이스 표현 목록의 하위 표현 (즉 {…; …}). - 더 이상 고민하지 않고 :

x
# Error: object 'x' not found
sum((x = 1), 2)
# [1] 3
x
# [1] 1

분명히 우리는 과제를 사용하여 수행했습니다 =, 컨텍스트 (a) 및 (b) 외부. 그렇다면 왜 핵심 언어 기능의 문서가 수십 년 동안 잘못 되었습니까?

R의 구문에서 기호가 있기 때문입니다 = 일상적으로 혼동되는 두 가지 의미가 있습니다.

  1. 첫 번째 의미는 과제 연산자. 이것이 우리가 지금까지 이야기 한 전부입니다.
  2. 두 번째 의미는 운영자가 아니라 오히려 a입니다 구문 토큰 그 신호 인수 통과 함수 호출에서. 와는 달리 = 연산자 런타임에 조치를 취하지 않으며 표현식이 구문 분석하는 방식 만 변경합니다.

보자.

일반적인 형태의 코드에서 ...

‹function_name›(‹argname› = <값>, …)
‹function_name›(‹args›, ‹argname› = <값>, …)

= 명명 된 인수 통과를 정의하는 토큰입니다. ~ 아니다 과제 연산자. 뿐만 아니라, = 전적으로입니다 금지 된 일부 구문 적 맥락에서 :

if (‹var› = <값>) …
while (‹var› = <값>) …
for (‹var› = <값> in ‹value2›) …
for (‹var1› in ‹var2› = <값>) …

이 중 어느 것도‹bla›에서 "예상치 못한 '='오류가 발생합니다.

다른 맥락에서 = 할당 연산자 호출을 나타냅니다. 특히, 서브 표현에 괄호를 두는 것만으로는 위의 (a) 중 어느 것도 유효하며 (b) 과제. 예를 들어, 다음은 과제를 수행합니다.

median((x = 1 : 10))

그러나 또한 :

if (! (nf = length(from))) return()

이제 그러한 코드가 끔찍하다고 반대 할 수 있습니다 (그리고 당신이 옳을 수도 있습니다). 그러나 나는이 코드를 가져 왔습니다 base::file.copy 기능 (교체 <- ~와 함께 =) - 코어 r 코드베이스의 대부분에서 광범위한 패턴입니다.

그만큼 John Chambers의 원본 설명, R 문서가 아마도 기반을 둔 것은 실제로 이것을 올바르게 설명합니다.

[= 할당은 문법의 두 곳에서만 허용됩니다 : 최상위 수준 (완전한 프로그램 또는 사용자 유형 표현식); 그리고 주변 논리 구조로부터 분리 될 때, 괄호 또는 여분의 괄호로.


고백 : 나는 일찍 거짓말을했다. 거기 ~이다 하나의 추가 차이점 = 그리고 <- 연산자 : 그들은 독특한 기능을 호출합니다. 기본적으로 이러한 기능은 동일한 작업을 수행하지만 동작을 변경하기 위해 그 중 하나를 별도로 무시할 수 있습니다. 대조적으로 <- 그리고 -> (왼쪽에서 오른쪽으로 할당) 구문 적으로 구별되지만 항상 같은 기능. 하나를 무시하면 다른 하나를 무시합니다. 이것을 아는 것은 거의 실용적이지 않습니다 그러나 그것은 ~할 수 있다 재미있는 shenanigans에 사용하십시오.

다른 팁

차이 과제 연산자 함수 호출에서 인수 값을 설정하기 위해 사용하면 더 명확합니다. 예를 들어:

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

이 경우 x 사용자 작업 공간에서 선언되므로 기능 호출이 완료된 후에 사용할 수 있습니다.


R 커뮤니티간에 사용에 대한 일반적인 선호가 있습니다. <- (매우) 이전 버전의 S-Plus와의 호환성에 대한 할당 (기능 서명 제외)의 경우. 공간은 같은 상황을 명확히하는 데 도움이됩니다

x<-3
# Does this mean assignment?
x <- 3
# Or less than?
x < -3

대부분의 R IDE에는 키보드 바로 가기가 있습니다 <- 입력하기가 더 쉽습니다. Ctrl 키 + = 건축가에서 대체 + - rstudio에서 (옵션 + - MacOS 아래), 옮기다 + - EMACS+ESS에서 (밑줄).


글쓰기를 선호하는 경우 = 에게 <- 그러나 공개적으로 공개 된 코드 (예 : CRAN)에 더 일반적인 할당 기호를 사용하려면 중 하나를 사용할 수 있습니다. tidy_* 의 기능 formatR 자동으로 교체 할 패키지 = ~와 함께 <-.

library(formatR)
tidy_source(text = "x=1:5", arrow = TRUE)
## x <- 1:5

"왜 x <- y = 5 오류를 던지지 만 아닙니다 x <- y <- 5? "는"파서에 포함 된 마법에 이르기까지 "입니다. R의 구문이 포함되어 있습니다. 많은 모호한 경우 그것은 어떤 식 으로든 해결되어야합니다. 파서는 여부에 따라 다른 순서로 표현식의 비트를 해결하기로 선택합니다. = 또는 <- 사용되었습니다.

무슨 일이 일어나고 있는지 이해하려면 과제가 할당 된 값을 조용히 반환한다는 것을 알아야합니다. 예를 들어 명시 적으로 인쇄하여 더 명확하게 볼 수 있습니다. print(x <- 2 + 3).

둘째, 할당에 접두사 표기법을 사용하는 경우 더 명확합니다. 그래서

x <- 5
`<-`(x, 5)  #same thing

y = 5
`=`(y, 5)   #also the same thing

파서는 해석합니다 x <- y <- 5 ~처럼

`<-`(x, `<-`(y, 5))

우리는 그것을 기대할 수 있습니다 x <- y = 5 그러면 그럴 것입니다

`<-`(x, `=`(y, 5))

그러나 실제로 그것은 해석됩니다

`=`(`<-`(x, y), 5)

이 때문입니다 = 보다 우선 순위가 낮습니다 <-, ?Syntax 도움말 페이지.

Google의 R 스타일 가이드는 할당을 위해 "="를 금지하여 문제를 단순화합니다. 나쁜 선택이 아닙니다.

https://google.github.io/styleguide/rguide.xml

R 매뉴얼은 5 개의 과제 연산자 모두에 대해 자세히 설명합니다.

http://stat.ethz.ch/r-manual/r-patched/library/base/html/assignops.html

x = y = 5 동일합니다 x = (y = 5), 할당 연산자가 "그룹"오른쪽에서 왼쪽으로 작동하기 때문에. 의미 : 5를 할당하십시오 y, 숫자 5를 떠나; 그런 다음 5를 할당하십시오 x.

이것은 동일하지 않습니다 (x = y) = 5, 작동하지 않습니다! 의미 : 값을 할당합니다 y 에게 x, 값을 남기고 y; 그런 다음 5를 할당, 음 ... 정확히 무엇입니까?

다른 종류의 과제 연산자를 혼합하면 <- 보다 단단한 바인딩 =. 그래서 x = y <- 5 로 해석됩니다 x = (y <- 5), 이것이 의미가있는 경우입니다.

안타깝게도, x <- y = 5 로 해석됩니다 (x <- y) = 5, 작동하지 않는 경우입니다!

보다 ?Syntax 그리고 ?assignOps 우선 순위 (바인딩) 및 그룹화 규칙.

운영자 인 John Chambers에 따르면 = "최상위"에서만 허용되며, 이는 다음과 같은 제어 구조에서는 허용되지 않습니다. if, 다음 프로그래밍 오류를 불법으로 만들었습니다.

> if(x = 0) 1 else x
Error: syntax error

그는 "제어 표현식에서 새로운 할당 양식 [=]을 허용하지 않으면 다른 S 과제보다 동등한 연산자에게 더 많은 프로그래밍 오류 (위의 예와 같은)를 피할 수 있습니다."

"주변 논리 구조에서 분리되어, 괄호 또는 여분의 괄호로"이를 수행 할 수 있습니다. if ((x = 0)) 1 else x 작동 할 것이다.

보다 http://developer.r-project.org/equalassign.html

연산자 <- 그리고 = 그들이 평가되는 환경에 할당하십시오. 연산자 <- 어디서나 사용할 수 있습니다. 반면 연산자 = 최상위 수준에서만 허용됩니다 (예 : 명령 프롬프트에 입력 된 전체 표현식에서) 또는 브레이스 표현식 목록의 하위 표현 중 하나입니다.

이것은 또한 두 연산자의 차이점을 이해하는 것도 추가 할 수 있습니다.

df <- data.frame(
      a = rnorm(10),
      b <- rnorm(10)
)

첫 번째 요소의 경우 r은 값과 올바른 이름을 할당했지만 두 번째 요소의 이름은 약간 이상하게 보입니다.

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 ...

R 버전 3.3.2 (2016-10-31); Macos Sierra 10.12.1

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top