【问题标题】:Get object and indices from subsetting call从子集调用中获取对象和索引
【发布时间】:2018-06-02 05:36:32
【问题描述】:

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

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

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

【问题讨论】:

  • 您希望解决方案是字面意义上的list(1:10, 2:3) 符号还是字符“列表(1:10,2:3)”或$x [1] 1 2 3 4 5 6 7 8 9 10 $ind [1] 2 3
  • 最后一个(数字)。我找到了解决方案。如果您有更好的解决方案,请添加。

标签: r nse


【解决方案1】:

看了pryr:::tree的代码,稍微试验了一下,找到了解决办法:

separate_call <- function(call) {
  call.sep <- as.list(substitute(call))
  parent_env <- parent.frame()
  x   <- eval(call.sep[[2]], parent_env)
  ind <- eval(call.sep[[3]], parent_env)
  list(x, ind)
}

验证:

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

[[2]]
[1] 2 3

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

[[2]]
[1] 1 2

【讨论】:

  • 似乎甚至不需要as.list
【解决方案2】:

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

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

【讨论】:

  • 很遗憾,如果您直接指定2:3 而不是indget 将不起作用。
  • 您应该将环境添加到 eval 调用中(假设您有 lyst &lt;- x; separate_call(lyst[ind])。无论如何,我认为我当前的解决方案会比使用正则表达式更强大。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-04
  • 1970-01-01
  • 1970-01-01
  • 2011-11-15
  • 2019-01-26
  • 1970-01-01
相关资源
最近更新 更多