2012-08-08 6 views
3

함수에 data.table 연산을 포함하는 데 문제가 있습니다. 입력 인수는 data.table 이름과 열/변수 이름입니다.Data.table 및 get() command (R)

get() 명령을 사용하여 data.table을 참조 할 수 있습니다. 그러나 변수 이름에 대해 동일한 명령을 사용하면 효과가 없습니다. 나는 get()이 열/변수 이름의 경우에는 적합하지 않을 수도 있지만 어떤 명령을 사용해야하는지 고민 중입니다.

편집 됨 : 이제 get() 대신 substitute()이 포함되었지만 여전히 작동하지 않습니다.

toy_example_fun <- function(d, .expr){ 

    .expr = substitute(.expr) 

    setkey(get(d), .expr) # ==> doesn't work 

    d.agg <- get(d)[,list(sum(y), sum(v)), by=.expr] # --> works 
} 

toy_example_fun("DT", x) 

대안 :quote() ->이 작동합니다. 그러나, 나는 함수 안에서 작동하는 솔루션에 관심이있다. 당신의 도움에 대한

<simpleError in doTryCatch(return(expr), name, parentenv, handler): object 'x' not found> 
    <simpleError in is.scalar(val): object 'x' not found> 
    <simpleError in is.data.frame(obj): object 'x' not found> 

감사 :

DT <- data.table(x=rep(c("a","b","c"),each=3), y=c(1,3,6), v=1:9)  
d <- "DT" 
variable <- quote(x) 
d.agg <- get(d)[,list(sum(y), sum(v)), by=variable] 

은 비록, 후자의 대안은 variable <- quote(x) 오류 메시지를 생성합니다 작동합니다. 여기

+1

중복 가능성 (http://stackoverflow.com/questions/9705488/using-data-table-와 i-and-j-arguments-in-functions) – Andrie

+0

스레드를 참조 해 주셔서 감사합니다, Andrie. 그러나, 어떻게 든'substitute()'를 사용하면 여전히 작동하지 않을 것입니다. – majom

+0

링크 된 질문에 대한 답변에 제안 사항을 포함 시켜서 질문을 편집하십시오. 그렇지 않으면 중복으로 닫힐 위험이 있습니다. – Andrie

답변

3

당신은 이동 :

someFun <- function(d, .expr){ 
    group <- substitute(.expr) 
    get(d)[,list(sum(y), sum(v)), by=group] 
} 

someFun("DT", x) 
    group V1 V2 
1:  a 10 6 
2:  b 10 15 
3:  c 10 24 


someFun("DT", "x") 
    x V1 V2 
1: a 10 6 
2: b 10 15 
3: c 10 24 

편집을 마태 복음에서 :

일을 위에서. 및/또는 문자 열 이름도 직접 by에 허용 :

someFun = function(d, col) { 
    get(d)[,list(sum(y),sum(v)),by=col] 
} 
someFun("DT","x") 
    x V1 V2 
1: a 10 6 
2: b 10 15 
3: c 10 24 
someFun("DT","x,y") 
    x y V1 V2 
1: a 1 1 1 
2: a 3 3 2 
3: a 6 6 3 
4: b 1 1 4 
5: b 3 3 5 
6: b 6 6 6 
7: c 1 1 7 
8: c 3 3 8 
9: c 6 6 9 

하지만 someFun("DT",x)이 작동하지 않습니다. 그래서 Adrie의 대답은 좀 더 일반적입니다.


EDIT [함수에서 data.table i와 j 인수를 사용]의 setkeyv

someFun <- function(d, cols){ 
    setkeyv(get(d), cols) 
    cols <- substitute(cols) 
    get(d)[,list(sum(y), sum(v)), by=cols] 
} 

someFun("DT", "x") 
    x V1 V2 
1: a 10 6 
2: b 10 15 
3: c 10 24 
+0

감사합니다, Andrie 및 Matthew. 당신의 대답이 많은 도움이되었습니다. 그러나, 나의 마지막 함수에서'setkey()'명령을 사용할 필요가있다. 다른 부분이 작동하는 동안'setkey (get (d), .expr)'줄은 여전히 ​​작동하지 않습니다. 사실, 그게 내 혼란을 일으키는 이유 였어. (처음에는'setkey() '에서 오류를 얻었으므로 집계를 한 번도 보지 못했다.) – majom

+0

@majom 대신'? setkeyv'를 시도해보십시오. 종료). –

+1

@majom 편집 됨'setkeyv'로 편집 됨 – Andrie

관련 문제