【问题标题】:R: convert character string to function argument [duplicate]R:将字符串转换为函数参数[重复]
【发布时间】:2019-03-11 10:16:47
【问题描述】:

我想知道,是否有一种通用方法可以将字符串转换为函数可识别的对象名称,例如 merge()write.table()

例如,我有许多数据帧要传递给组合的 Reduce merge 函数。

由于我不想手写所有的名字,我尝试了以下代码:

# some data
d1 <- data.frame(ID = c("1","2", "3"),
                 A = c(1.1, 2.2, 2.4), 
                 B = c(11.7, 10.2, 9.6))

d2 <- data.frame(ID = c("9","11", "18"),
                 A = c(1.8, 1.2, 1.4), 
                 B = c(11.9, 10.5, 9.1))

d3 <- data.frame(ID = c("10","13", "15"),
                 A = c(1.0, 1.5, 1.6), 
                 B = c(10.3, 11.5, 12.1))

# generate names
d_names <- sprintf("d%d",seq(1:3))

# pass vector with names to the function
dat <- Reduce(function(x, y) merge(x, y, all=TRUE), 
              list(noquote(paste(as.character(d_names), collapse = ", "))))

它不适用于noquote()。生成的数据框应如下所示。

dat <- Reduce(function(x, y) merge(x, y, all=TRUE), 
              list(d1, d2, d3))

如何将字符向量转换为d1, d2, d3,以便函数将其识别为不同数据帧的名称?

是否有将字符串转换为函数可识别的“输入对象”的通用方法,例如write.table()

for (i in 1:length(d_names)) {

  write.table(x = paste0(d_names[i]), file = paste0("path/path/", d_names[i], ".txt"), sep = "\t", 
              col.names = TRUE)

}

如何替换表达式x = paste0(d_names[i]),以便write.table()merge() 识别实际对象d1d2d3

【问题讨论】:

  • 您可以尝试mget(d_names) 作为起点。
  • 然后做Reduce(function(x, y) merge(x, y, all=TRUE), mget(d_names))
  • 我一直在寻找更一般的答案,如何将字符串转换为对象,也可以将其作为write.table() 或其他函数的输入。是否有将字符串转换为“输入对象”的通用方法?

标签: r


【解决方案1】:

此解决方案使用mget 并使用paste 创建变量名称。

# some data
d1 <- data.frame(ID = c("1","2", "3"),
                 A = c(1.1, 2.2, 2.4), 
                 B = c(11.7, 10.2, 9.6))

d2 <- data.frame(ID = c("9","11", "18"),
                 A = c(1.8, 1.2, 1.4), 
                 B = c(11.9, 10.5, 9.1))

d3 <- data.frame(ID = c("10","13", "15"),
                 A = c(1.0, 1.5, 1.6), 
                 B = c(10.3, 11.5, 12.1))

dat1 <- Reduce(function(x, y) merge(x, y, all=TRUE), 
               list(d1, d2, d3))

dat2 <- Reduce(function(x, y) merge(x, y, all=TRUE), 
              mget(paste("d", 1:3, sep = "")))

identical(dat1, dat2)
#> [1] TRUE

reprex package (v0.2.1.9000) 于 2019 年 3 月 11 日创建

【讨论】: