【问题标题】:How to assign function argument to variable name如何将函数参数分配给变量名
【发布时间】:2021-11-15 10:44:24
【问题描述】:

假设我有这些数据:

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 解决方案都很棒。

【问题讨论】:

    标签: r function variables tidyverse variable-assignment


    【解决方案1】:

    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

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

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

    【讨论】:

    • 太棒了。为什么是双!!?
    • @bill999 为什么要加倍是什么意思?
    • 对不起,我的意思是为什么'tidyverse''mutate'行中有两个感叹号。
    • !!:= 是您在创建变量之前用来评估 varname 的语法。否则,新变量的名称将是 varname 而不是 newvar。有关详细信息,请参阅帮助页面:?`!!`
    • 我会调查的。谢谢!
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2019-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多