2014-02-25 2 views
12

최근 우아한 R 패키지 data.table에 대해 알게되었습니다. J 함수가 어떻게 구현되는지 궁금합니다. 이 함수는 [.data.table 함수에 바인딩되어 있으며 전역 환경에는 존재하지 않습니다.J() 함수는 data.table에서 어떻게 구현됩니까?

소스 코드를 다운로드했지만이 J 함수에 대한 정의를 찾을 수 없습니다. lockBind(".SD", ...)을 찾았지만 J은 찾지 못했습니다. 이 기능이 어떻게 구현되는지 알고 싶습니다.

감사합니다.

+1

http://adv-r.had.co.nz/dsl.html이 이런 종류의 일이 구현되는 일반적인 기술을 설명하는 데 도움이 될 수 있습니다. – hadley

답변

14

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(.)가 검출되고, 단순히 (보이지 않는) 비 익스포트 기능을 사용 .massageilist(.) 대체. 단순히

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이 발생해야합니다.

관련 문제