2016-09-11 3 views
1

함수 f에 대한 첫 번째 호출은 작동하지만 두 번째 호출은 작동하지 않습니다. 어떻게 함수를 기대할 수 있도록 함수 f에 문자열 ("v")을 전달할 수 있습니까? 내가 사용 좋아하지 않기 때문에 내가 dtt에서 전환변수를 예상하는 함수에 문자열을 매개 변수로 전달하는 방법

library(data.table) 
library(purrr) 

dat <- data.table(v="a") 

f <- function(dt, x) { 

    # first, see if 'x' is a variable holding a string with a column name 

    seval <- safely(eval) 
    res <- seval(x, dt, parent.frame()) 

    # if it is, then get the value, otherwise substitute() it 

    if ((!is.null(res$result)) && inherits(res$result, "character")) { 
    y <- res$result 
    } else { 
    y <- substitute(x) 
    } 

    # if it's a bare name, then we deparse it, otherwise we turn 
    # the string into name and then deparse it 

    if (inherits(y, "name")) { 
    y <- deparse(y) 
    } else if (inherits(y, "character")) { 
    y <- deparse(as.name(x)) 
    } 

    dt[, y, with=FALSE] 

} 

f(dat,v) 
## v 
## 1: a 

f(dat, "v") 
## v 
## 1: a 

V <- "v" 
f(dat, V) 
## v 
## 1: a 

f(dat, VVV) 
#> throws an Error 

:

library(data.table) 

f<-function(t,x) t[,deparse(substitute(x)),with=F] 

dat<-data.table(v="a") 

f(dat,v) 
# v 
# 1: a 

f(dat,eval(parse(text="v"))) 
# Error in `[.data.table`(t, , deparse(substitute(x)), with = F) : 
# column(s) not found: eval(parse(text = "v")) 
+5

'dat [, .SDcols = cols]'처럼'.SDcols'와 함께'dat [, mget (col)]'또는'.SD'와 같이'mget() = "v"'. 동일한 함수 인수에 (열의) * 및 * 기호를 문자 벡터로 사용하는 것은 문제와 모호함을 불러옵니다. – Arun

답변

3

그것은 더 이상 한 줄을하지 않습니다하지만 당신은 당신이 전달하는지 테스트 할 수 있습니다 변수 이름으로 내장 함수의 이름 (예 :)을 사용해야합니다. 더 큰 코드 블록에서 미묘한 오류가 발생하여 디버깅이 어려울 수 있습니다.

또한 f()을 실행할 때마다 f() 함수 외부에서 safely() 호출을 호출하여 함수 호출을 저장합니다. 원할 경우 예전의 try() 학교를 사용할 수 있지만 언젠가는 깨질 수있는 try-error을 확인해야합니다. tryCatch()도 포장 할 수 있지만 safely() 방법이 나에게 깨끗해 보입니다.

+1

'dt'는 내장 함수의 이름이기도합니다 !! 어리석은 t- 분포. 나는'DT'를 선호한다 – MichaelChirico

+0

사실, Student t 배포판을 사용하는 것보다 데이터를 이전하려고 할 가능성이 훨씬 높다. – hrbrmstr

관련 문제