【问题标题】:function to subset data supplying subset argument as text string将子集参数作为文本字符串提供子集数据的函数
【发布时间】:2018-04-20 00:19:50
【问题描述】:
 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)

这是可能的,但我认为会有更简单更直接的方法(我上面的“胶水”)。

【问题讨论】:

    标签: r function subset eval


    【解决方案1】:

    一种方法是使用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
    

    【讨论】:

      【解决方案2】:
        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
      

      【讨论】:

        猜你喜欢
        • 2016-04-25
        • 1970-01-01
        • 2012-07-18
        • 1970-01-01
        • 1970-01-01
        • 2015-09-12
        • 1970-01-01
        • 2016-05-13
        • 2012-08-06
        相关资源
        最近更新 更多