在R,是否有可能让软件忽略在运行模块时定义了未使用的参数这一事实?
例如,我有一个模块multiply(a,b),它返回的产物a和b.如果我这样调用模块,我将收到错误:
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)
一种方法(我无法想象是良好的编程实践)是添加...传统上用于将一个函数中指定的参数传递给另一个函数的方法.
> 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)
你可以阅读更多关于...旨在使用这里
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)
您可以...在函数定义中使用点:
myfun <- function(a, b, ...){
cat(a,b)
}
myfun(a=4,b=7,hello=3)
# 4 7
Run Code Online (Sandbox Code Playgroud)