【发布时间】:2018-12-01 20:34:12
【问题描述】:
我想捕获所有参数和值并返回一个命名列表。在提供的值是函数调用的情况下,我遇到了麻烦。
下面产生了一个“call”类的对象,这对我来说很不方便,因为我想在它上面调用paste:
fun1 = function(a = 1) as.list(match.call()[-1])
value1 = fun1(a = letters[1:2])
class(value1[[1]])
[1] "call"
paste(value1[[1]], collapse = " - ")
[1] "[ - letters - 1:2" #not useful to me
作为一种解决方法,我可以调用eval 来获取由c 创建的字符向量(lapply 函数用于说明当有多个参数时,将在所有参数上调用eval):
fun2 = function(a = 1) lapply(as.list(match.call()[-1]), eval)
value2 = fun2(a = letters[1:2])
class(value2[[1]])
[1] "character"
paste(value2[[1]], collapse = " - ")
[1] "a - b" #that's what I want
有没有更好的方法来做到这一点?在一堆事情上调用 eval 只是为了获取值对我来说似乎有点奇怪。
编辑:这背后的想法是我想将参数列表传递给原始函数中的函数(该函数接受其参数之一的命名列表)。我想捕获用户提供的值和默认值(用于用户未提供任何内容的参数)。
我在其他地方了解到,我可以通过 match.call 和 formals 的组合获得所有这些。但是,假设我需要将其传递给httr::GET 函数的query 参数,并在我这样做之前对其进行一些处理(例如在“a”和“b”之间添加“-”)。然后我最终得到类似“[ - 字母 - 1:2”而不是“a - b”。
我感觉如果答案是使用eval,那么我可能问错了问题。
【问题讨论】:
-
如果您想要评估的参数,为什么要使用 match.call?这似乎完全没有必要。
-
@Roland 感谢您的评论!我试图在原帖中澄清。我觉得我问错了问题,但目前无法找出正确的问题。
-
我还是不明白。是什么阻止您在函数中使用类似 list(a) 的东西?如有必要,可能与省略号结合使用?
标签: r