动态创建参数名称

时间:2019-10-03 15:02:03

标签: r function parameters parameter-passing

R中是否可以在函数调用中动态创建参数名称?

例如,如果我们以

开头
name <- "variable"

我想创建一个像这样的新数据框

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

这当然不起作用。

我唯一可以发明的解决方案是

arg <- list(c(1, 2))
names(arg) <- name
a.new.data.frame <- do.call(data.frame, arg)
a.new.data.frame
#  variable
#1        1
#2        2

我不喜欢这段代码,因为它看起来并不优雅。

有更好的方法吗?

PS重要!这是我在编写R程序时遇到的一个更普遍的问题(例如,当我使用ggplot以及许多其他情况时)。因此,我希望对此有一般的解决方案(创建data.frame只是一个示例)。

2 个答案:

答案 0 :(得分:1)

使用tidyverse

的选项
library(tibble)
library(dplyr)
tibble(!! name := c(1, 2))
# A tibble: 2 x 1
#  variable
#     <dbl>
#1        1
#2        2

答案 1 :(得分:1)

用于动态参数的更紧凑的代码如下所示:

df <- do.call(data.frame, list(name = c(1, 2)))

您可以使用?dotsMethodsdo.call封装在这样的通用函数中,以节省通话中嘈杂的list()部分:

call.with.dyn.args <- function(f, ...) {
  args <- list(...)
  do.call(f, args)
}

df1 <- call.with.dyn.args(data.frame, a = 1:2, b = letters[1:2])
df1
# a b
# 1 1 a
# 2 2 b

但是您还可以通过其他选项将动态参数传递给不带do.call的函数,例如:

dyn.values <- c(1:2)
name = "dyn.values"
df2 <- data.frame(dyn.values,                     # values from a variable
                  name = dyn.values,              # values from a variable + new name
                  static.arg = letters[1:2],      # usual direct passing of an arg
                  name.from.variable = get(name)) # get the values from a variable whose name is stored in another variable
df2
#   dyn.values name static.arg name.from.variable
# 1          1    1          a                  1
# 2          2    2          b                  2