R中未使用的参数

时间:2012-04-22 17:42:04

标签: r

R中,是否有可能让软件忽略在运行模块时定义了未使用的参数的事实?

例如,我有一个模块multiply(a,b),它返回ab的产品。如果我这样调用模块,我将收到错误:

multiply(a=20,b=30,c=10)

由于已经指定了所需的输入ab,因此返回错误似乎有点不必要。是否有可能避免这种不良行为?

一个简单的解决方案就是停止指定c,但这并不能解答为什么R表现得像这样。还有另一种解决方法吗?

7 个答案:

答案 0 :(得分:30)

更改multiply的定义以获取其他未知参数:

multiply <- function(a, b, ...) {
  # Original code
}

答案 1 :(得分:8)

一种方法(我无法想象是良好的编程习惯)是添加传统上用于将一个函数中指定的参数传递给另一个函数的...

> multiply <- function(a,b) a*b
> multiply(a = 2,b = 4,c = 8)
Error in multiply(a = 2, b = 4, c = 8) : unused argument(s) (c = 8)
> multiply2 <- function(a,b,...) a*b
> multiply2(a = 2,b = 4,c = 8)
[1] 8

您可以详细了解...打算使用here

答案 2 :(得分:5)

您可以在函数定义中使用点:...

myfun <- function(a, b, ...){
  cat(a,b)
}

myfun(a=4,b=7,hello=3)

# 4 7

答案 3 :(得分:5)

R.utils包有一个名为doCall的函数,就像do.call,但是如果传递了未使用的参数,它不会返回错误。

multiply <- function(a, b) a * b

# these will fail
multiply(a = 20, b = 30, c = 10)
# Error in multiply(a = 20, b = 30, c = 10) : unused argument (c = 10)
do.call(multiply, list(a = 20, b = 30, c = 10))
# Error in (function (a, b)  : unused argument (c = 10)

# R.utils::doCall will work
R.utils::doCall(multiply, args = list(a = 20, b = 30, c = 10))
# [1] 600
# it also does not require the arguments to be passed as a list
R.utils::doCall(multiply, a = 20, b = 30, c = 10)
# [1] 600

答案 4 :(得分:2)

我和你有同样的问题。我有一长串的论点,其中大多数都是无关紧要的。我不想硬编码。这就是我想出来的

library(magrittr)
do_func_ignore_things <- function(data, what){
    acceptable_args <- data[names(data) %in% (formals(what) %>% names)]
    do.call(what, acceptable_args %>% as.list)
}

do_func_ignore_things(c(n = 3, hello = 12, mean = -10), "rnorm")
# -9.230675 -10.503509 -10.927077

答案 5 :(得分:0)

R 有一个函数 prod() 可以很好地进行乘法运算。提问者给出的示例与 prod() 函数配合良好,不会返回错误。`

prod(a=20,b=30,c=10)

 # 6000

无论如何,突出显示的错误是纠正它的机会,因此不是坏行为。

答案 6 :(得分:0)

由于已经有许多直接解决问题的答案,而且 R 经常被技术熟练的非程序员使用,让我快速概述错误存在的原因,并建议不要使用抑制解决方法。

参数的数量是定义函数的一个重要方面。如果参数数量不匹配,这很好地表明调用者的意图与函数将要执行的操作之间存在不匹配。出于这个原因,这将是许多编程语言的编译错误,包括 Java、Python、Haskell 和许多其他语言。事实上,如果类型不匹配,许多这些语言中更严格的类型检查也会导致错误。

随着程序规模的增长和代码的老化,越来越难以发现这种不匹配是有意的还是真正的错误。这就是为什么“干净的代码”的想法 - 易于阅读且没有错误或警告的代码 - 通常是专业程序员的标准工作。

因此,我建议重新编写代码以删除不必要的参数。以后为自己和他人理解和调试会更简单。

当然,我理解 R 用户经常使用生命周期有限的小脚本,并且大型软件工程项目的通常权衡并不总是适用。也许对于您的快速脚本,它只会使用一周,只是抑制错误是有意义的。然而,人们广泛观察到(我在自己的经验中也看到),在撰写本文时,代码的持久性很少是显而易见的。如果您追求开放科学,并发布您的代码和数据,那么该代码在未来对他人有用,因此他们可以重现您的结果,这尤其有帮助。