sourcecode

"="와 "<-" 할당 연산자의 차이점은 무엇입니까?

codebag 2023. 6. 27. 22:11
반응형

"="와 "<-" 할당 연산자의 차이점은 무엇입니까?

연산자 에는 어떤 차이점이 있습니까?=그리고.<- R로에?

이 예에서 알 수 있듯이 연산자가 약간 다르다는 것을 알고 있습니다.

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

하지만 이것이 유일한 차이점일까요?

할당 연산자의 차이는 함수 호출에서 인수 값을 설정하는 데 사용할 때 더 명확합니다.예:

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

에는 부분의에는바로가기키가있습다니대▁▁make▁to다있▁most▁keyboard습니키대를 만들기 위한 키보드 단축키가 있습니다.<-타이핑하기 쉬운Ctrl Architect에서= RStudio에서 Option+(MacOS에서 +), emacs에서 +(언더스코어)+ESS.


이 선경를는우를 쓰는 것을 한다면,=<-그러나 공개적으로 공개된 코드(예: CRAN)에 대해 더 일반적인 할당 기호를 사용하고 싶을 때, 당신은 의 함수 중 하나를 사용할 수 있습니다.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

는 파가통역합니다을서ts다합을 해석합니다.x <- y <- 5~하듯이

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

우리는 그것을 기대할 수 있습니다.x <- y = 5 렇다면그가 될 입니다.

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

하지만 실제로 그것은 해석됩니다.

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

는 는이유 때문입니다.=는 보낮 은우순니다입위선보다 우선 .<-도움말 페이지에 표시된 대로.

연산자 에는 어떤 차이점이 있습니까?=그리고.<-R로에?

에서 알 수 있듯이, 당의예알수있이듯서에신,,=그리고.<-연산자 우선 순위(같은 식에 혼합된 경우 평가 순서를 결정함)가 약간 다릅니다.실제로 R에서 연산자 우선 순위 표는 가장 높은 값부터 가장 낮은 값까지 제공됩니다.

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

하지만 이것이 유일한 차이점일까요?

당신이 할당 연산자에 대해 질문했기 때문에: 네, 그것이 유일한 차이점입니다.하지만, 당신은 다른 것을 믿는 것에 대해 용서받을 것입니다.더 많은 차이가 있다는 주장에 대한 R 문서도 있습니다.

산자<-할 수 어서나사수있반면는연, 는자산용할디▁operator.=최상위 수준(예: 명령 프롬프트에서 입력한 전체 식)에서만 사용할 수 있으며, 브레이스된 식 목록에서 하위 식 중 하나로 사용할 수 있습니다.

R 문서가 잘못되었다는 점을 너무 세세하게 지적하지는 맙시다.이것은 보여주기 쉽습니다: 우리는 단지 반례를 찾기만 하면 됩니다.=에서 ( 연산자 또는 표현식의 (a) 최상또있연는(b) 표의즉표(b) 현현이식, 니닙다아)이 연산자.{…; …} - - 추가작없이업::

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

▁using다ment,니를 사용하여 과제를 수행했습니다.= ( (b에서. (a) 및 (b) 맥밖서에문서밖에▁(▁outside▁of▁contexts(문맥▁(▁(.그렇다면, 핵심 R 언어 기능의 문서화가 수십 년 동안 잘못된 이유는 무엇일까요?

R의 에서 R의 는 왜면의구기호이기 =(위에서 인용한 문서를 포함하여 전문가들에 의해서도) 일상적으로 혼동되는 두 가지 다른 의미가 있습니다.

  1. 첫 번째 의미는 할당 연산자입니다.이것이 우리가 지금까지 이야기한 전부입니다.
  2. 두 번째 의미는 연산자가 아니라 함수 호출에서 전달되는 명명된 인수를 나타내는 구문 토큰입니다.과는 달리= 연산자 런타임에 작업을 수행하지 않고 식이 구문 분석되는 방식만 변경합니다.

렇다면은어다사결까니정합용을법의 요?=연산자 또는 명명된 인수 전달을 의미합니까?어디 보자꾸나

일반적인 형태의 코드 조각에서 …

‹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›) …

이 중 하나라도 있으면 "블라"에서 "예상치 못한 '='"라는 오류가 발생합니다.

맥락에서도, 다른맥서보면에락,,=할당 연산자 호출을 나타냅니다.특히, 부분 표현식 주위에 괄호를 두는 것만으로도 위의 (a) 중 하나가 유효하고, (b) 할당이 됩니다.예를 들어 다음은 할당을 수행합니다.

median((x = 1 : 10))

그러나 또한:

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

이제 당신은 그러한 코드가 잔인하다고 반대할 수 있습니다(그리고 당신이 옳을 수도 있습니다).하지만 저는 이 코드를 가지고 왔습니다.base::file.copy (<-와 함께= R 코드베이스에 패턴입니다 — 이것은 대부분의 핵심 R 코드베이스에 널리 퍼져 있는 패턴입니다.

R 문서의 기초가 될 것으로 추정되는 John Chambers의 원래 설명은 실제로 이를 정확하게 설명합니다.

[=할당은 문법의 두 곳에서만 허용됩니다. 즉, 최상위 수준(완전한 프로그램 또는 사용자 정의 표현식)과 주변 논리 구조에서 분리된 경우 중괄호 또는 추가 괄호 쌍으로 구분됩니다.


""입니다.<-그리고.=같은 일을 합니다.그러나 둘 중 하나를 개별적으로 재정의하여 동작을 변경할 수 있습니다.대조적으로,<-그리고.->(왼쪽에서 오른쪽으로 할당), 구문적으로 구별되지만 항상 동일한 함수를 호출합니다.하나를 재정의하면 다른 하나도 재정의됩니다.이것을 아는 것은 거의 실용적이지 않지만 재미있는 속임수에 사용될 수 있습니다.

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에 합니다: 5를 5로 지정합니다.y5를 를 5에서 5로 합니다.x.

은 이다음같않다습니지과는다않과 .(x = y) = 5그안돼요당! 합니다: 값할건.yx의 두고y그 다음에 5명을 배정해, 음... 정확히 뭐죠?

연산자를 때, 다른종할연섞를으면자산당의류,<- 바한인보다 더 단단히 =.그렇게x = y <- 5는 로해됩니다로 됩니다.x = (y <- 5)그게 말이 되는 경우입니다.

불하게도행,,x <- y = 5는 로해됩니다로 됩니다.(x <- y) = 5그것이 효과가 없는 경우입니다!

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

Chambers에 ,=는 " level되며, 는 " 상위에레벨허"와 같은 되지 않는다는 것을 합니다.if다음 프로그래밍 오류를 불법으로 만듭니다.

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

그는 "제어 식에서 새 할당 양식 [=]을(를) 허용하지 않으면 다른 S 할당보다 동일한 연산자를 사용할 가능성이 높은 (위의 예와 같은) 프로그래밍 오류를 피할 수 있습니다."라고 쓰고 있습니다.

"주변 논리 구조와 분리되어 있고, 중괄호 또는 추가 괄호 쌍으로 분리되어 있는" 경우 이 작업을 수행할 수 있습니다.if ((x = 0)) 1 else x효과가 있을 것입니다.

http://developer.r-project.org/equalAssign.html 을 참조하십시오.

공식 R 문서에서:

<-그리고.=평가 환경에 할당합니다. 산자<-연산자는 최상위 수준(예: 명령 프롬프트에 입력된 완전한 식)에서만 사용할 수 있거나 브레이스된 식 목록의 하위 식 중 하나로 사용할 수 있습니다.

이는 두 연산자의 차이를 이해하는 데에도 도움이 될 수 있습니다.

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 시에라 10.12.1

8.2.26에서 = <- 패트릭>의 동의어가 아닌 여기서 패트릭 번즈의 책 <린페르노>가 인용되었는지 확신할 수 없습니다. <- 패트릭>은 "당신은 함수의 인수를 설정하고 싶을 때 분명히 '<-'를 사용하고 싶지 않습니다."라고 말합니다. 책은 https://www.burns-stat.com/documents/books/the-r-inferno/ 에서 구할 수 있습니다.

사이에는 몇 가지 차이점이 있습니다.<-그리고.=R의 과거 버전 또는 심지어 R(S 언어)의 이전 언어에서도.하지만 현재, 그것은 사용되는 것 같습니다.=다른 현대 언어(자바, 자바)와 마찬가지로 문제를 일으키지 않습니다.다음을 사용하여 더 많은 기능을 구현할 수 있습니다.<-을 일부 이상한을 할 수 .

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

강력 추천!이 두 가지의 차이점을 설명하는 최고의 기사를 읽어 보십시오.https://colinfay.me/r-assignment/ 을 확인하십시오.

, 또한해, 각보세요생에 대해 <-보이지 않게 값을 반환하는 함수로서.

a <- 2
(a <- 2)
#> [1] 2

참조: https://adv-r.hadley.nz/functions.html

언급URL : https://stackoverflow.com/questions/1741820/what-are-the-differences-between-and-assignment-operators

반응형