【问题标题】:R: How to use as.call with vectors as optional parameters?R:如何将 as.call 与向量一起用作可选参数?
【发布时间】:2014-02-26 21:34:05
【问题描述】:

我正在尝试为函数编写一个包装器,以便将列表用作输入。我不能更改函数本身,因此我需要一个解决方法。我使用as.call(),它在没有可选参数的情况下工作,但是当我有向量作为可选参数时,我无法让它工作。

例子:

# function I cannot change
func <- function(..., opt=c(1,2)) {
    cl <- match.call(expand.dots = FALSE)
    names <- lapply(cl[[2]],as.character)  
    ev <- parent.frame()
    classes <- unlist(lapply(names,function(name){class(get(name,envir=ev))}))    
    print(c(opt,names, classes))
}

a <- structure(1:3, class="My_Class")
b <- structure(letters[1:3], class="My_Class")

lst <- list(a, b)
names(lst) <- c("a","b")

# Normal result
func(a,b,opt=c(3,4))

# This should give the same but it doesn't
call <- as.call(append(list(func), list(names(lst), opt=c(3,4))))
g <- eval(call, lst)

我也尝试了c(),而不是list 作为可选参数,但这也不起作用。有人有建议或帮助页面吗? ?call 没有明确我的问题。

(我已经在这里问过关于该主题的上一个问题:R: How to use list elements like arguments in ellipsis?,但遗漏了有关可选参数的详细信息,现在无法弄清楚。)

【问题讨论】:

  • 通常我会建议do.call(func, c(lst, list(opt=c(3,4))))。但是,这不适用于您声称无法更改的功能。但是,将参数从列表传递给函数将是正常的方式。所以,你的函数可以被认为是以非标准的方式做事。
  • 您可能无法更改func,但您肯定可以编写一个新函数来执行您想要的操作。
  • 使用lists 作为输入有什么重要之处?完全不清楚func 应该采用什么样的参数,但是将list 元素转换为其他类型的对象当然很容易,您可以在循环中将其提供给func 或*apply。
  • Roland:我同意,但是因为我想使用这样实现的包,所以我唯一的选择是编写包维护者。我会这样做,但目前我想要一个可行的解决方案。但是感谢您指出应该如何使用它:这样我就可以提出一个改进功能的提议:)
  • Hong Ooi:确实是这样,但是因为有多个这样的功能,所以有点复制粘贴和重写整个包。在最坏的情况下,我会这样做。

标签: r list call optional-parameters


【解决方案1】:

这对我来说在两个版本下都会产生相同的结果

call <- as.call(c(list(quote(func)), lapply(names(lst), as.name), list(opt=c(3,4))))
g <- eval(call, lst)

编辑:根据 Hadley 在 cmets 中的建议。

【讨论】:

  • 非常感谢您再次帮助我!这个解决方案还不令人满意,因为我不想显式地输入每个 a 和 b,这就是为什么我想首先提交一个列表。有没有像apply(quote,names(list)) 这样的可能性?我去看看quote,这似乎是一个很有前途的想法。
  • @user2075339,查看修改。
  • 非常感谢您救了我!我试图更好地自己解决问题,但经过 3 天的尝试,我放弃了。你有什么建议我应该从哪里开始阅读以学习这些东西?
  • R manual "R Language Definition" 是一个很好的资源。起初它可能看起来有点神秘,但绝对值得坐在你的 R 终端并尝试准确理解他们解释的内容。一旦你正确理解它,我会挑战你重新编写你正在使用正确方式的包中的函数,以便它们按预期工作,并将它们提交给维护者进行替换;)。
  • @BrodieG append 和 c 的组合相当令人困惑。同样使用quote(func) 而不是func 会导致更自然的调用。
猜你喜欢
  • 1970-01-01
  • 2020-02-17
  • 1970-01-01
  • 2021-04-02
  • 2015-12-17
  • 2013-06-04
  • 1970-01-01
  • 1970-01-01
  • 2019-02-22
相关资源
最近更新 更多