在运行时更改R函数的默认参数

13

在R中,是否有可能在运行时更改函数的形式参数的默认值?

假设我们有以下函数:

f <- function(x=1) { 
    ...
}

我能否以某种方式将x的默认值从1更改为例如2?


提前致谢,
Sven


一个有趣的问题,但听起来有点危险。你为什么想这样做呢? - csgillespie
我正在尝试为R实现一个虚拟机,因此我需要知道函数签名是否可以假定为不可变。 - Sven Hager
https://dev59.com/FWLVa4cB1Zd3GeqPsQaY#9895903 - GSee
4个回答

7

更新:2020-12-13

该方法已不再可用

是的,Defaults包可以让您实现此操作。


4
我找到了另一种完成这个任务的方法:formals(f) = pairlist(x=1) - Sven Hager
3
基本上这就是默认值的作用,你可能想使用alist而不是listpairlist - Joshua Ulrich
很酷。我可能会用这个来将paste( , sep=" ")改成paste( , sep="")。(是的,我知道在R 2.15.0中有paste0) - Kevin Wright
4
请注意,使用像paste这样广泛使用的支持函数时要小心。您可能会破坏一些难以诊断的内容。 - Joshua Ulrich
1
看起来 Defaults 已经不再从 CRAN 上提供了。您仍然可以使用 formals 函数来完成此操作,请参见:https://dev59.com/FWLVa4cB1Zd3GeqPsQaY#9895903 - Jake Fisher

2

另一种方法(在不同的SO帖子中显示)是使用formals函数,例如:

formals(f) <- 2


1

我尝试对packagefinder库进行相同的参数包装,该库有一个别名fp()指向findPackage()。我尝试了各种方法,包括使用formals(),但最终对我有效的只有以下三个变体:

#--------------------------------------
# packagefinder
#--------------------------------------
# fp = findPackage
# Set default to use: 
#   fp(... , display = "console", return.df = TRUE)
#--------------------------------------
fp <- function(...) {
  packagefinder::fp(..., display="console", return.df=TRUE)
}

fp <- function(...) invisible(findPackage(..., display="console", return.df=TRUE))
fp <- function(..., display="console", return.df=TRUE) packagefinder::fp(...,display=display, return.df=return.df)

我无法让 formals() 方法正常工作。

# Fail-1
formals(fp) <- alist(... = , display="console", return.df=TRUE)

# Fail-2
MY_ARGS <- list(display="console", return.df=TRUE)
formals(fp)[names(MY_ARGS)] <- MY_ARGS

以下是与此相关的其他帖子:


1
作为Defaults包已经不再从CRAN提供,您可以使用default
例如:
x <- list(a = 1, b = 2, c = 3)
default::default(unlist) <- list(use.names = FALSE)
unlist(x)
#> [1] 1 2 3

unlist <- default::reset_default(unlist)
unlist(x)
#> a b c 
#> 1 2 3

这段文字是在2019年03月22日由reprex包(版本为v0.2.0.9000)创建的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接