解析的match.call到命名列表

时间:2018-07-17 18:06:17

标签: r function call

我在一个函数中有一个调用被拒绝(使它更易于阅读),并将其作为输出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)
  

$ v1

     

[1] 11

     

$ v2

     

[1] 22

     

$ v3

     

[1] 33

需要明确的是,我不愿意按原样存储调用对象,因为在探索S3对象时,它不会给用户足够的信息(我认为程序员应该处理所有事情,而用户应该只是享受功能)。

2 个答案:

答案 0 :(得分:3)

怎么样

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

基本上,我们将字符串解析回一个表达式,然后用list()函数换出原始函数名称,可以对它求值以实际构建列表。

答案 1 :(得分:1)

您可以执行以下操作:

eval(parse(text=sub("^.+?\\(","list(",obj)))