功能将子集数据的子集提供为文本字符串

时间:2017-11-07 14:40:55

标签: r function subset eval

 m <- matrix(1:4, ncol=2)
 l <- list(a=1:3, b='c')
 d <- data.frame(a=1:3, b=3:1)

我想知道是否有可能创建一个带有基本R对象(矩阵,向量,列表或data.frame,...)的函数以及指定对象子集的文本。

f1 <- function(object, subset) {
    # object'subset' 
  }

例如

f1(m, '[1,1]') #to evaluate m[1,1]
f1(l, '[[1]][2:3]') #l[[1]][2:3]
f1(d, '$a') #d$a

会给我们(分别):

[1] 1
[1] 2 3
[1] 1 2 3

我想函数需要在评估之前以某种方式粘合两个参数。我猜一个人可以为子集文本的每个位做一个解释器,并且(对于矩阵示例)做类似的事情:

`[`(1,1)

这是可能的,但我认为会有一种更直接的方式(我上面的'胶水')。

2 个答案:

答案 0 :(得分:3)

一种方法是使用eval(parse))方法,即

f1 <- function(x, text){
  eval(parse(text = paste0(x, text)))
}

f1('d', '$a')
#[1] 1 2 3

f1('m', '[1,1]')
#[1] 1

f1('l', '[[1]][2:3]')
#[1] 2 3

答案 1 :(得分:1)

  f1<-function(object, subset){    
    return(eval(parse(text=paste0(substitute(object),subset)))) 
 }

> m=matrix(4,2,2)
> l=list(c(1,2,3),c(2,3,4))
> f1(m,'[1,1]')
[1] 4

> f1(l,'[[1]][1:2]')  
[1] 1 2