with - rx axis




data.table이 정의 된 이유는 무엇입니까?=오버로드가 아닌<-? (2)

나는 다음과 같은 이유 때문에 기술적 인 이유가 있다고 생각하지 않는다. :=[...] 내부에서만 사용되므로 항상 인용된다. [...] 는 식 트리를 통과하여 := 이 있는지 여부를 확인합니다.

즉, 실제 운영자가 아니며 과부하 상태가 아닙니다. 그래서 그들은 그들이 원하는 오퍼레이터를 꽤 많이 골라 낼 수있었습니다. 아마 더 잘 어울린 것 같아? 분명히 <- ?가 아니기 때문에 혼란스럽지 않습니까?

( :=[...] 외부 에서 사용 되었다면 <- , 실제로 오버로드 할 수 없기 때문에 <- . <- 왼쪽 인수를 평가하지 않으므로 형식을 알지 못합니다 )입니다.

data.table은 : = 연산자를 도입했습니다. 왜 과부하가되지 않는가?


<- overloaded> 할 수있는 장소가 두 곳 있습니다.

x[i, j] <- value           # 1
x[i, {colname <- value}]   # 2

x 째는 x 의 전체를 *tmp* 복사하고, 작업 사본을 변경하고, x 다시 할당합니다. 이것은 r-devel에 대해 최근에 논의 된 R의 것 (src / main / eval.c 및 subassign.c)입니다. 패키지 또는 R 자체가 *tmp* 복사를 피할 수 있도록 R을 변경하는 것이 가능할 수도 있지만 현재 가능하지는 않습니다. IIUC.

두 번째 질문은 Owen의 답변이 언급 한 것입니다. 당신이 그와 같은 j 내에서 참조에 의한 할당을하면 좋다는 것을 받아들이면 어떤 연산자를 사용합니까? Owen의 대답에 대한 설명에 따르면, <-<<- 는 이미 j 사용자에 의해 사용되었으므로 다음과 같이 충돌합니다.

[<- x 의 전체를 복사하지 않았더라도, 우리는 여전히 j := 와 같이 := 과 같이 할 수 있습니다 :

DT[,{newcol1:=sum(a)
     newcol2:=a/newcol1}, by=group]

테이블에 대한 참조로 새 열을 추가하고 각 열의 := 는 각 그룹 내에서 평가됩니다. (그룹 내에서 : =가 구현 된 경우)

2012 년 10 월 업데이트

1.8.2 (2012 년 7 월의 CRAN)부터 := by group 은 단일 열의 추가 또는 업데이트를 위해 구현되었습니다. 즉,의 단일 LHS := . 그리고 v1.8.3 (글쓰기 당시의 R-Forge)에서는 그룹별로 여러 개의 열을 추가 할 수 있습니다. 예를 들어,

DT[, c("newcol1","newcol2") := .(sum(a),sum(b)), by=group]

또는 아마도 더 우아하게 :

DT[,`:=`(newcol1=sum(a),
         newcol2=sum(b)), by=group]

그러나 두 번째 표현식이 첫 번째 표현식의 결과를 사용할 수있는 잠시 생각한 반복적 인 복수형 RHS는 아직 구현되지 않았습니다 ( FR#1492 ). 따라서 여전히 "newcol1 not found" 오류가 발생하며 두 단계로 수행해야합니다.

DT[,`:=`(newcol1=sum(a),
         newcol2=a/newcol1), by=group]




colon-equals