"="와 "<-" 할당 연산자의 차이점은 무엇입니까?
연산자 에는 어떤 차이점이 있습니까?=
그리고.<-
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의 는 왜면의구기호이기 =
(위에서 인용한 문서를 포함하여 전문가들에 의해서도) 일상적으로 혼동되는 두 가지 다른 의미가 있습니다.
- 첫 번째 의미는 할당 연산자입니다.이것이 우리가 지금까지 이야기한 전부입니다.
- 두 번째 의미는 연산자가 아니라 함수 호출에서 전달되는 명명된 인수를 나타내는 구문 토큰입니다.과는 달리
=
연산자 런타임에 작업을 수행하지 않고 식이 구문 분석되는 방식만 변경합니다.
렇다면은어다사결까니정합용을법의 요?=
연산자 또는 명명된 인수 전달을 의미합니까?어디 보자꾸나
일반적인 형태의 코드 조각에서 …
‹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로 지정합니다.y
5를 를 5에서 5로 합니다.x
.
은 이다음같않다습니지과는다않과 .(x = y) = 5
그안돼요당! 합니다: 값할건.y
x
의 두고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 을 참조하십시오.
연
<-
그리고.=
평가 환경에 할당합니다. 산자<-
연산자는 최상위 수준(예: 명령 프롬프트에 입력된 완전한 식)에서만 사용할 수 있거나 브레이스된 식 목록의 하위 식 중 하나로 사용할 수 있습니다.
이는 두 연산자의 차이를 이해하는 데에도 도움이 될 수 있습니다.
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
'sourcecode' 카테고리의 다른 글
SQL Developer는 스크립트 실행을 지원합니까? (0) | 2023.06.27 |
---|---|
오류: TCP 공급자: 오류 코드 0x2746입니다.Linux에서 터미널을 통해 SQL을 설정하는 동안 (0) | 2023.06.27 |
개체와 레코드 유형의 차이 (0) | 2023.06.27 |
Vue.js: 메서드에서 계산된 속성을 사용하면 정의되지 않은 오류가 반환됩니다. (0) | 2023.06.27 |
Oracle SYS 계정과 SYSTEM 계정의 차이점은 무엇입니까? (0) | 2023.06.27 |