将串联字符串作为R中的函数参数传递

时间:2020-02-07 18:46:20

标签: r

我正在尝试创建串联的字符串并将其传递给函数。假设我想创建一个数据框列表,可以将其传递给函数。问题是使用“ noquote”功能的连接字符串被视为“ noquote”对象,而不是我想要的列表。这是一个可重现的示例。如果我使用data <- dflist1定义数据,那么我得到了想要的东西,但是当我尝试data1 <- noquote(paste0("dflist", selection))时,它不会返回相同的列表。

是否可以通过仅更改selection来创建所需列表?

在我面临的实际问题中,需要以这种方式更改多个函数参数,因此学习如何实现此技巧将非常有帮助。

任何评论将不胜感激!

a <- data.frame(aa = c(1,2,3), bb = c(4,5,6))
b <- data.frame(cc = c(11,12,13), dd = c(41,51,61))

dflist1 <- list(a, b)
dflist2 <- list(a, b, a, b)

selection <- "1"   # I want to make a choice here

data <- dflist1
data1 <- noquote(paste0("dflist", selection))

print(data1)
[1] dflist1

print(data)
[[1]]
  aa bb
1  1  4
2  2  5
3  3  6

[[2]]
  cc dd
1 11 41
2 12 51
3 13 61

class(data)
[1] "list"
class(data1)
[1] "noquote"

1 个答案:

答案 0 :(得分:3)

我们可以使用get返回值

get(data1)
#[[1]]
#  aa bb
#1  1  4
#2  2  5
#3  3  6

#[[2]]
#  cc dd
#1 11 41
#2 12 51
#3 13 61

如果我们检查str(data1),将会了解到,在“字符”之上,它会添加一个class noquote

str(data1)
#'noquote' chr "dflist1"

class(data1)
#[1] "noquote"

通过更改属性

noquote
#function (obj, right = FALSE) 
#{
#    if (!inherits(obj, "noquote")) 
#        class(obj) <- c(attr(obj, "class"), if (right) c(right = "noquote") else "noquote")
#    obj
#}

paste0以字符串形式返回对象名称,无需使用noquote。简单地,用get包装,它返回该list的值,或者如果有多个对象,则使用mget