如何将函数参数分配给变量名

How to assign function argument to variable name

假设我有这些数据:

data <- data.frame(a = c(1,2,3))

还有一个创建数据框的简单函数。它还基于一个简单的函数创建了一个新变量;这个新变量采用通过 varname 传入的名称。这是我的尝试(assign 行是错误的):

fun <- function(varname) {
    data <- data.frame(a = c(1,2,3))
    assign(paste0("data$", varname), sqrt(data$a))  
    data
}

fun("newvar")

Base R 或 tidyverse 解决方案都很棒。

你很接近!有多种子集数据框的方法,包括使用 [[.]] 表示法(例如 data[["var"]]。只需将值分配给新列即可初始化该列。

fun <- function(varname) {
    data <- data.frame(a = c(1,2,3))
    data[[varname]] <- sqrt(data$a)
    data
}

fun("newvar")

tidyverse

如果您想将变量名称作为字符串传递,那么 tidyverse 方法将是:

library(dplyr)

fun <- function(varname) {
  data.frame(a = c(1,2,3)) %>% 
    mutate(!! varname := sqrt(a))
}

fun("newvar")

或者,您可以使用 tidyeval 这样就不必引用变量名称:

library(dplyr)

fun <- function(varname) {
  varname <- rlang::enquo(varname)
  data.frame(a = c(1,2,3)) %>% 
    mutate(!! varname := sqrt(a))
}

fun(newvar)

基础 R

如果您想使用 base R,我会推荐@Noah 发布的解决方案,但另一个相当迟钝的 base R 选项是:

fun <- function(varname) {
  data.frame(a = c(1,2,3)) |>
    within(eval(substitute(x <- sqrt(a), list(x = as.name(varname)))))
}

fun("newvar")