1.8.8 이후에는 이전에 내보내기가 사용되었습니다. 여기 1.8.8
에서 메모의 :
J()
별명은 이제 외부 DT[...]
을 제거하지만, 여전히 DT[...]
내부 작동 O를; 즉 DT[J(...)]
이 좋습니다. v1.8.2 (이 파일의 아래 참조)에서 경고되었으며 v1.8.4의 warning()
과 함께 사용되지 않습니다. 이 경우 XLConnect
(# 1747) 및 rJava
(# 2045) 패키지의 J()
함수와의 충돌을 해결합니다. 대신 data.table()
을 직접 입력하고 DT[...]
외부로 입력하십시오. R의 지연 평가 사용
, J(.)
가 검출되고, 단순히 (보이지 않는) 비 익스포트 기능을 사용 .massagei
list(.)
대체. 단순히
i = eval(.massagei(isub), x, parent.frame())
곳 isub = substitute(i)
및 .massagei
입니다 :
require(data.table)
DT = data.table(x=rep(1:5, each=2L), y=1:10, key="x")
DT[J(1L)]
i
(= J(1L)
가) 해당 유형에 대한 선택되어 있고이 라인이 실행됩니다 :
그게 당신이 할 때,
.massagei = function(x) {
if (is.call(x) && as.character(x[[1L]]) %chin% c("J","."))
x[[1L]] = quote(list)
x
}
기본적으로 data.table:::.massagei(quote(J(1L)))
이 실행되면 list(1L)
을 반환하고 data.table
으로 변환합니다. 그리고 거기에서 join
이 발생해야합니다.
http://adv-r.had.co.nz/dsl.html이 이런 종류의 일이 구현되는 일반적인 기술을 설명하는 데 도움이 될 수 있습니다. – hadley