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只是一个示例)。
答案 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)))
您可以使用?dotsMethods
将do.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