代码之家  ›  专栏  ›  技术社区  ›  Mehrad

取消匹配。调用命名列表

  •  1
  • Mehrad  · 技术社区  · 8 年前

    我在我的一个函数中部署了一个调用(使其更易于阅读),并将其作为输出S3对象的一部分包括在内,以供最终用户参考。

    func1 <- function(v1, v2, ...){
        return(deparse(match.call()))
    }
    
    obj <- func1(11, 22, v3 = 33)
    

    这个 obj 变量现在包含:

    func1(v1=11,v2=22,v3=33)

    现在,在另一个接受此对象作为输入的函数中,我想将此调用字符向量转换为命名列表,使其具有与以下内容相同的结构:

    list(v1 = 11, v2 = 22, v3 = 33)
    

    $1

    〔1〕11

    $2

    〔1〕22

    $3

    〔1〕33

    明确地说,我不愿意按原样存储调用对象,因为当用户探索S3对象时,调用对象对用户来说并不像应该的那样具有信息性(我认为程序员应该处理所有事情,用户应该享受这个功能)。

    2 回复  |  直到 8 年前
        1
  •  1
  •   moodymudskipper    8 年前

    您可以执行以下操作:

    eval(parse(text=sub("^.+?\\(","list(",obj)))
    
        2
  •  3
  •   Mehrad    8 年前

    这个怎么样

    to_list <- function(x) {
      xex <- parse(text= x )[[1]]
      xex[[1]] <- quote(list)
      eval.parent(xex)
    }
    to_list(obj)
    

    基本上,我们将字符串解析回一个表达式,然后用 list() 函数可以对其进行计算以实际构建列表。