功能列的“动态”命名

时间:2020-05-28 22:51:18

标签: r

我想分配一个动态名称,即我要传递给该函数的变量的名称,作为该函数正在创建的数据框中的列名。

我尝试过

- deparse(substitute(x))
- toString(x)

但没有成功...

代码

a <- (1:3)
b <- (5:7)

df <- data.frame(a,b)

fun <- function(x){
  x %>% mutate(c=a+b)
  colnames(x)[3] <- deparse(substitute(x))
  }

预期行为

运行fun(df)之后:

  a b  df
1 1 5  6
2 2 6  8
3 3 7 10

相反:

> fun(df)
Error in names(x) <- value : 
  'names' attribute [3] must be the same length as the vector [2]

1 个答案:

答案 0 :(得分:1)

我们可以将:=用于评估(!!

fun <- function(x){
    nm1 <-  deparse(substitute(x))
     x %>% 
        mutate(!! nm1 := a+b)

   }

fun(df)
#  a b df
#1 1 5  6
#2 2 6  8
#3 3 7 10

在OP的函数中,x %>% mutate的输出未分配回,因此,原始数据集只有两列而不是三列,即如果有的话

fun <- function(x){
   nm1 <- deparse(substitute(x))
    x <- x %>% # assign the output after mutate
            mutate(c=a+b)
   colnames(x)[3] <- nm1
   x # return the dataset
  }   


fun(df)
#  a b df
#1 1 5  6
#2 2 6  8
#3 3 7 10