【问题标题】:Pass string as argument to paste function将字符串作为参数传递给粘贴函数
【发布时间】:2020-12-19 06:21:01
【问题描述】:

我正在尝试将字符串变量名称传递给粘贴函数以将所有字符串粘贴在一起。这是一个mwe:

#bind strings to variable names
a <- c("abc", "def", "ghi")
b <- c("jkl", "mno", "pqr")
c <- c("stu", "vwx", "yz1")

paste(eval(letters[1:3]))
# "a" "b" "c"

然而,我想要的是 3 个变量的内容粘贴到一个字符串中

"abc def ghi jkl mno pqr stu vwx yz1"

我知道准引用,所以我尝试过

get(letters[1:3])

但这只会给我

"abc def ghi"

我知道这个话题在整个互联网上都有非常详细的介绍,但我尝试了每一个 rlang 动词都没有成功。

【问题讨论】:

  • 如果需要获取多个值,使用mget()而不是get(),后者只返回第一个。它们将在列表中返回。所以也许paste(unlist(mget(letters[1:3])), collapse = " ") 是你需要的。不过,这些都不是rlang。使用 R lang 它可能看起来像这样:rlang::eval_tidy(rlang::expr(paste(c(!!!rlang::syms(letters[1:3])), collapse=" ")))
  • 哦,这很简单,实际上解决了我的问题。谢谢!有没有直接返回字符向量的解决方案(避免unlist)?
  • 除非您执行do.call() 路由,否则基本 R 中没有任何内容可以扩展为多个参数。但是在这里你需要以某种方式结合你所有的价值观。我不确定您的想法是如何编写它paste(a,b,c) 不会返回您想要的值。你需要paste(c(a,b,c), collapse=" "),这可以用paste(do.call("c", c(mget(letters[1:3]))), collapse=" ")来完成。但是你需要一些东西来组合这些向量,无论是c() 还是unlist()。
  • paste(unlist(mget 解决方案是最优雅的。如果你发布它,我会接受它。

标签: r concatenation quasiquotes


【解决方案1】:

@MrFlick 建议的答案简单明了。这是一种在单个字符上使用get 的方法。

paste0(sapply(letters[1:3], get, envir = .GlobalEnv), collapse = " ")
#[1] "abc def ghi jkl mno pqr stu vwx yz1"

【讨论】:

    【解决方案2】:

    为了完整起见,要应用准引用,您只需将字符串转换为符号:

    s <- lapply( letters[1:3], as.name )
    paste( do.call("c", s), collapse=" " )
    # [1] "abc def ghi jkl mno pqr stu vwx yz1"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-25
      • 2012-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-12
      • 1970-01-01
      相关资源
      最近更新 更多