如何将函数参数分配给变量名
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")
假设我有这些数据:
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")