R中未使用的参数

dpl*_*net 22 r

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

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

multiply(a=20,b=30,c=10)
Run Code Online (Sandbox Code Playgroud)

返回这个错误只是似乎有点多余,因为所需的投入a,并b已被指定.有可能避免这种不良行为吗?

一个简单的解决方案就是停止指定c,但这并不能解决为什么R会这样做.还有另一种解决方法吗?

Mat*_*erg 32

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

multiply <- function(a, b, ...) {
  # Original code
}
Run Code Online (Sandbox Code Playgroud)


Cha*_*ase 9

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

> 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
Run Code Online (Sandbox Code Playgroud)

你可以阅读更多关于...旨在使用这里


War*_*art 8

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
Run Code Online (Sandbox Code Playgroud)


Ben*_*nes 5

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

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

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

# 4 7
Run Code Online (Sandbox Code Playgroud)