R:如何从自定义函数中的名称获取值或对象?
R: how to get the value or object from a name in a custom function?
我正在尝试创建一个用于批量分析的自定义函数,一开始它是这样的:
> myfunction <- function(DATA, col1, col2, col3){
> print(class(col3)) #"name"
> print(is.object(col3)) #FALSE
> library(plyr)
> output <- ddply(DATA, .(eval(col1), eval(col2)), summarize, N=sum(eval(col3)),...)
> ...
> }
> myfunction(DATA=df, col1=quote(colA), col2=quote(colB), col3=quote(colC)) #colA[chr], colB[chr], colC[numeric] are column names in dataframe df
但这就是我得到的:
> Error in eval("col3") : object 'col3' not found
> 10. eval("col3")
> 9. eval(cols[[col]], .data, parent.frame())
> 8. eval(cols[[col]], .data, parent.frame())
> 7. .fun(piece, ...)
> 6. (function (i) { piece <- pieces[[i]] if (.inform) { ...
> 5. loop_apply(n, do.ply)
> 4. llply(.data = .data, .fun = .fun, ..., .progress = .progress, .inform = .inform, .parallel = .parallel, .paropts = .paropts)
> 3. ldply(.data = pieces, .fun = .fun, ..., .progress = .progress, .inform = .inform, .parallel = .parallel, .paropts = .paropts)
> 2. ddply(DATA, .(eval(col1), eval(col2)), summarize, N = sum(eval(col3)))
> 1. myfunction(DATA = df, col1 = quote(colA), col2= quote(colB), col3 = quote(colC))
我不明白为什么在 col3 之前出现错误,而 col1 和 col2 没有问题。
由于自定义函数中的 class(col3) 向我显示 col3 是一个“名称”,我将 eval() 替换为 get() 但它不起作用。
谁能告诉我如何获取名称 col3 后面的对象?
还是我从一开始就走错了路,需要彻底改变我的心态?
使用 dplyr
可能比 plyr
更容易。这是更改函数的一种方法
myfunction <- function(DATA, col1, col2, col3){
plyr::ddply(DATA, c(col1, col2),
.fun = function(.data) c(N = sum(.data[[col3]], na.rm = TRUE)))
}
-测试
> myfunction(mtcars, "cyl", "vs", "mpg")
cyl vs N
1 4 0 26.0
2 4 1 267.3
3 6 0 61.7
4 6 1 76.5
5 8 0 211.4
# outside the function
> plyr::ddply(mtcars, c("cyl", "vs"), summarize, N = sum(mpg))
cyl vs N
1 4 0 26.0
2 4 1 267.3
3 6 0 61.7
4 6 1 76.5
5 8 0 211.4
我正在尝试创建一个用于批量分析的自定义函数,一开始它是这样的:
> myfunction <- function(DATA, col1, col2, col3){
> print(class(col3)) #"name"
> print(is.object(col3)) #FALSE
> library(plyr)
> output <- ddply(DATA, .(eval(col1), eval(col2)), summarize, N=sum(eval(col3)),...)
> ...
> }
> myfunction(DATA=df, col1=quote(colA), col2=quote(colB), col3=quote(colC)) #colA[chr], colB[chr], colC[numeric] are column names in dataframe df
但这就是我得到的:
> Error in eval("col3") : object 'col3' not found
> 10. eval("col3")
> 9. eval(cols[[col]], .data, parent.frame())
> 8. eval(cols[[col]], .data, parent.frame())
> 7. .fun(piece, ...)
> 6. (function (i) { piece <- pieces[[i]] if (.inform) { ...
> 5. loop_apply(n, do.ply)
> 4. llply(.data = .data, .fun = .fun, ..., .progress = .progress, .inform = .inform, .parallel = .parallel, .paropts = .paropts)
> 3. ldply(.data = pieces, .fun = .fun, ..., .progress = .progress, .inform = .inform, .parallel = .parallel, .paropts = .paropts)
> 2. ddply(DATA, .(eval(col1), eval(col2)), summarize, N = sum(eval(col3)))
> 1. myfunction(DATA = df, col1 = quote(colA), col2= quote(colB), col3 = quote(colC))
我不明白为什么在 col3 之前出现错误,而 col1 和 col2 没有问题。
由于自定义函数中的 class(col3) 向我显示 col3 是一个“名称”,我将 eval() 替换为 get() 但它不起作用。
谁能告诉我如何获取名称 col3 后面的对象?
还是我从一开始就走错了路,需要彻底改变我的心态?
使用 dplyr
可能比 plyr
更容易。这是更改函数的一种方法
myfunction <- function(DATA, col1, col2, col3){
plyr::ddply(DATA, c(col1, col2),
.fun = function(.data) c(N = sum(.data[[col3]], na.rm = TRUE)))
}
-测试
> myfunction(mtcars, "cyl", "vs", "mpg")
cyl vs N
1 4 0 26.0
2 4 1 267.3
3 6 0 61.7
4 6 1 76.5
5 8 0 211.4
# outside the function
> plyr::ddply(mtcars, c("cyl", "vs"), summarize, N = sum(mpg))
cyl vs N
1 4 0 26.0
2 4 1 267.3
3 6 0 61.7
4 6 1 76.5
5 8 0 211.4