如何将函数调用中的参数用作R中数据帧中的名称?

如何将函数调用中的参数用作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

我试图修改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.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