将字符向量转换为函数调用

时间:2014-07-10 08:55:42

标签: r

我该怎么做呢

d <- "3:10"

并神奇地把它变成了这个

[1]  3  4  5  6  7  8  9 10

之前我已经看过这件事,并且广泛搜索过,但无法回想起任何事情。

这是我尝试过的。

> eval(d)
# [1] "3:10"
> eval(noquote(d))
# [1] 3:10
> noquote(eval(d))
# [1] 3:10
> evalq(d)
# [1] "3:10"
> substitute(d)
# d

1 个答案:

答案 0 :(得分:4)

我认为你正在寻找可怕的eval(parse(...))构造。

尝试:

d <- "3:10"
eval(parse(text = d))
# [1]  3  4  5  6  7  8  9 10

一个有趣的方法可能是:

Reduce(":", as.numeric(strsplit(d, ":", TRUE)[[1]]))
# [1]  3  4  5  6  7  8  9 10

而且,whaddyaknow!我不会,但它比eval(parse(...))更快(但你在评论中的方法更快)。

fun1 <- function() Reduce(":", as.numeric(strsplit(d, ":", TRUE)[[1]]))
fun2 <- function() eval(parse(text = d))
fun3 <- function() {
  s <- as.numeric(strsplit(d, ":", fixed = TRUE)[[1]])
  s[1]:s[2]
}

library(microbenchmark)
microbenchmark(fun1(), fun2(), fun3())
# Unit: microseconds
#    expr     min       lq   median       uq     max neval
#  fun1()  24.375  26.0865  32.2865  55.8070 113.751   100
#  fun2() 108.192 112.4680 121.4490 204.8375 453.720   100
#  fun3()   8.553  10.6920  12.8300  20.9550  40.198   100