从子集调用中获取对象和索引

时间:2018-06-02 05:36:32

标签: r nse

基本上,我想创建一个R函数separate_call,它获取类似x[ind]的参数并返回xind(因此,来自父环境):

x <- 1:10
ind <- 2:3
separate_call(x[ind]) ## should return `list(1:10, 2:3)`

我知道我需要使用非标准评估和一些树解析,但我对这两个概念不够熟悉。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

我正在添加此解决方案,不是很优雅,看看这是否符合您的需求。

separate_call <- function(m){
    dprse <- deparse(substitute(m)) ##deparsing the data: to make it as string
    lyst <- strsplit(dprse,"\\[|\\]")[[1]] ##removing the square brackets to sparate contents of m
    lapply(lyst, function(y)eval(parse(text = y), envir = parent.frame()))

}

我希望这有效,我通过三种不同方式调用它来尝试它

separate_call(1:10[ind])
separate_call(x[2:3])
separate_call(1:10[2:3])

他们都给了我同样的回应

> separate_call(1:10[ind])
[[1]]
 [1]  1  2  3  4  5  6  7  8  9 10

[[2]]
[1] 2 3

> separate_call(x[2:3])
[[1]]
 [1]  1  2  3  4  5  6  7  8  9 10

[[2]]
[1] 2 3

> separate_call(1:10[2:3])
[[1]]
 [1]  1  2  3  4  5  6  7  8  9 10

[[2]]
[1] 2 3