在自定义函数中子集 data.cube
subsetting data.cube inside custom function
我正在尝试创建自己的函数以在 R 中对 data.cube 进行子集化,并为我打算构建的一些预定义绘图自动格式化结果。
这是我的职能。
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())
我总是遇到上述错误。
知道为什么会这样吗?我应该以其他方式继续编辑绘图子集的方法吗?
这是R用户在处理非标准评价时会面临的标准问题。这是 Computing on the language R 语言功能的结果。
[.data.cube
函数期望以交互方式使用,这扩展了传递给它的参数的灵活性,但给出了一些限制。在这方面,它类似于 [.data.table
将表达式从包装函数传递到 [
子集运算符。我添加了虚拟示例以使其可重现。
我看到您已经在使用 data.cube-oop
分支,所以只是为了向其他读者说明一下。 data.cube-oop
分支在 master 分支之前提交 92,要安装使用以下内容。
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
您只需输入 print(expr)
before/instead eval(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
?
我正在尝试创建自己的函数以在 R 中对 data.cube 进行子集化,并为我打算构建的一些预定义绘图自动格式化结果。
这是我的职能。
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())
我总是遇到上述错误。
知道为什么会这样吗?我应该以其他方式继续编辑绘图子集的方法吗?
这是R用户在处理非标准评价时会面临的标准问题。这是 Computing on the language R 语言功能的结果。
[.data.cube
函数期望以交互方式使用,这扩展了传递给它的参数的灵活性,但给出了一些限制。在这方面,它类似于 [.data.table
将表达式从包装函数传递到 [
子集运算符。我添加了虚拟示例以使其可重现。
我看到您已经在使用 data.cube-oop
分支,所以只是为了向其他读者说明一下。 data.cube-oop
分支在 master 分支之前提交 92,要安装使用以下内容。
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
您只需输入 print(expr)
before/instead eval(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
?