[英]deparsed match.call to a named list
我在我的一个函数中对调用进行了解析(以使其更具可读性),并将其作为输出 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 对象时,它不会像用户应该的那样提供信息(我认为程序员应该处理所有事情,而用户应该只是享受功能)。
这个怎么样
to_list <- function(x) {
xex <- parse(text= x )[[1]]
xex[[1]] <- quote(list)
eval.parent(xex)
}
to_list(obj)
基本上我们将字符串解析回一个表达式,然后用list()
函数交换原始函数名称,可以对其进行评估以实际构建列表。
考虑到obj
是您在问题中显示的字符串,您可以执行以下操作:
eval(parse(text=sub("^.+?\\(","list(",obj)))
但是如果你想在函数内部使用它,你可以执行以下操作并避免 deparsing 和 parsing:
func1 <- function(v1, v2, ...){
# catch the call
tmp_the_call <- match.call()
# convert to list
tmp_the_call <- as.list(tmp_the_call)
# remove the function name
tmp_the_call <- tmp_the_call[-1]
return(tmp_the_call)
}
# Or as one-liner
func1 <- function(v1, v2, ...){
return(as.list(match.call())[-1])
}
func1("qq", "ww", v3 = "ee", "rr")
这将导致:
$v1 [1] "qq" $v2 [1] "ww" $v3 [1] "ee" [[4]] [1] "rr"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.