如何将函数调用中的参数用作R中数据帧中的名称?
我试图修改tapply的输出,以获得结果的垂直转置 大概是这样的:如何将函数调用中的参数用作R中数据帧中的名称?,r,R,我试图修改tapply的输出,以获得结果的垂直转置 大概是这样的: Levels of y Mean of x A 1.7 B 3.5 C 5.0 而不是: A B C 1.7 3.5 5.0 我已通过以下方式成功生成数据帧: myfunction=function(x,y,FUN,...) { array1<-tapply(x,y,FUN,...) a<-data.fra
Levels of y Mean of x
A 1.7
B 3.5
C 5.0
而不是:
A B C
1.7 3.5 5.0
我已通过以下方式成功生成数据帧:
myfunction=function(x,y,FUN,...) {
array1<-tapply(x,y,FUN,...)
a<-data.frame(names(array1),array1)
rownames(a)<-NULL
print(a)
}
attach(InsectSprays)
myfunction(count,spray,mean)
问题1)
现在我想修改该函数,以便使用在调用函数本身时传递给myfunction的参数(在本例中为“spray”和“Sum of count”)更改数据帧的colName
我试过这样的东西
myfunction=function(x,y,FUN,...) {
array1<-tapply(x,y,FUN,...)
a<-data.frame(names(array1),array1)
rownames(a)<-NULL
colnames(a)<-c(y,print(FUN,"of",x)
print(a)
}
myfunction=function(x,y,FUN,…){
array1您尝试使用的方法称为非标准评估,它广泛用于tidyverse软件包系列,以及base R中的一些函数,如带
、内的和$运算符
您可能希望探索这个概念
同时,也可以在base R中使用一个函数,该函数使用deparse
和substitute
进行非标准评估:
myfunction 5 E 3.500000
#>6楼16.666667
myfunction(气缸、档位、mtcars、总和)
#>齿轮和齿轮
#> 1 3 112
#> 2 4 56
#> 3 5 30
此函数的更高级版本还允许您直接传递向量,而无需
数据
参数:
myfunction <- function(x, y, data, FUN, ...)
{
if (missing(data)) data <- parent.frame()
y_name <- deparse(substitute(y))
col_name <- paste(deparse(substitute(FUN)), "of", y_name)
x <- eval(substitute(x), envir = as.environment(data))
y <- eval(substitute(y), envir = as.environment(data))
array1 <- tapply(x, y, FUN, ...)
a <- setNames(data.frame(names(array1), array1), c(y_name, col_name))
rownames(a) <- NULL
print(a)
}
myfunction您可能正在这里寻找rlang软件包。查找rlang NSE quosures
@hyiltiz这在rlang中会更容易,但在base R中也有很多方法可以做到这一点(请参见我的答案),这对学习该语言的工作原理很有启发。非常感谢!我将探讨这个概念。
myfunction=function(x,y,FUN,...) {
array1<-tapply(x,y,FUN,...)
a<-data.frame(names(array1),array1)
rownames(a)<-NULL
print(a)
}
myfunction<-(count,spray,sum,data=InsectSprays)
myfunction <- function(x, y, data, FUN, ...)
{
if (missing(data)) data <- parent.frame()
y_name <- deparse(substitute(y))
col_name <- paste(deparse(substitute(FUN)), "of", y_name)
x <- eval(substitute(x), envir = as.environment(data))
y <- eval(substitute(y), envir = as.environment(data))
array1 <- tapply(x, y, FUN, ...)
a <- setNames(data.frame(names(array1), array1), c(y_name, col_name))
rownames(a) <- NULL
print(a)
}
var1 <- 1:10
var2 <- rep(1:2, 5)
myfunction(var1, var2, FUN = median)
#> var2 median of var2
#> 1 1 5
#> 2 2 6