2016-10-20 1 views
3

내 자신의 기능을 R에서 data.cube의 하위 집합으로 만들려고하고 있으며 빌드를 목표로하는 미리 정의 된 일부 플롯에 대한 결과의 형식을 자동으로 지정합니다.사용자 정의 함수 내에서 데이터 집합 subsetting

이것은 제 기능입니다.

require(data.table) 
require(data.cube) 

secciona <- function(cubo = NULL, 
        fecha_valor = list(), 
        loc_valor = list(), 
        prod_valor = list(), 
        drop = FALSE){ 

    cubo[fecha_valor, loc_valor, prod_valor, drop = drop] 

    ## The line above will really be an asignment of type y <- format(cubo[...drop]) 
    ## Rest of code which will end up plotting the subset of the function 
} 

것은 내가 오류가 계속입니다 : Error in eval(expr, envir, enclos) : object 'fecha_valor' not found 나를 위해 가장 이상한 무엇

는 광산의 부분 집합 함수 내에서 정의 할 때 콘솔에 모든 것이 잘 작동하지만 것입니다. 콘솔에서

:

> dc[list(as.Date("2013/01/01"))] 
> dc[list(as.Date("2013/01/01")),] 
> dc[list(as.Date("2013/01/01")),,] 
> dc[list(as.Date("2013/01/01")),list(),list()] 

모두가 결과로 제공 :

<data.cube> 
fact: 
    5627 rows x 2 dimensions x 1 measures (0.32 MB) 
dimensions: 
    localizacion : 4 entities x 3 levels (0.01 MB) 
    producto : 153994 entities x 3 levels (21.29 MB) 
total size: 21.61 MB 

을하지만

secciona(dc) 
secciona(dc, fecha_valor = list(as.Date("2013/01/01"))) 
secciona(dc, fecha_valor = list()) 

을 시도 할 때마다 언급 위에 나는 항상 오류가 발생합니다.

왜 이런 생각입니까? 플로팅을 위해 부분 집합을 편집하는 방식에 대해 다른 방법으로 진행해야합니까?

답변

2

비표준 평가를 처리 할 때 R 사용자가 직면하게 될 표준 문제입니다. 이것은 언어의 결과입니다. R 언어 기능.
[.data.cube 함수는 대화 형 방식으로 전달되기위한 인수의 유연성을 확장하지만 일부 제한이 있습니다. 해당 측면에서 래퍼 함수에서 [ 하위 집합 연산자로 표현식을 전달할 때 [.data.table과 비슷합니다. 재현 할 수 있도록 더미 예제를 추가했습니다.

다른 사용자를 위해 명확하게하기 위해 이미 data.cube-oop 분기를 사용하고 있습니다. data.cube-oop 브랜치는 master 브랜치보다 먼저 커밋되며, 다음을 사용한다.

install.packages("data.cube", repos = paste0("https://", c(
    "jangorecki.gitlab.io/data.cube", 
    "Rdatatable.github.io/data.table", 
    "cran.rstudio.com" 
))) 

library(data.cube) 
set.seed(1) 
ar = array(rnorm(8,10,5), rep(2,3), 
      dimnames = list(color = c("green","red"), 
          year = c("2014","2015"), 
          country = c("IN","UK"))) # sorted 
dc = as.data.cube(ar) 

f = function(color=list(), year=list(), country=list(), drop=FALSE){ 
    expr = substitute(
     dc[color=.color, year=.year, country=.country, drop=.drop], 
     list(.color=color, .year=year, .country=country, .drop=drop) 
    ) 
    eval(expr) 
} 
f(year=list(c("2014","2015")), country="UK") 
#<data.cube> 
#fact: 
# 4 rows x 3 dimensions x 1 measures (0.00 MB) 
#dimensions: 
# color : 2 entities x 1 levels (0.00 MB) 
# year : 2 entities x 1 levels (0.00 MB) 
# country : 1 entities x 1 levels (0.00 MB) 
#total size: 0.01 MB 

당신은 식을 추적 할 수 있습니다

단지/대신 eval(expr) 전에 print(expr)을 넣어.

비표준 평가에 대한 자세한 읽기 : - R Language Definition: Computing on the language
- Advanced R: Non-standard evaluation
-
manual of substitute function
그리고 일부 SO 관련을 질문 :
- Passing on non-standard evaluation arguments to the subset function
- In R, why is [ better than subset?