【问题标题】:Externally set default argument of a function from a package从包中外部设置函数的默认参数
【发布时间】:2019-09-13 09:11:00
【问题描述】:

我正在构建一个包含具有默认参数的函数的包。导入函数后,我想找到一种干净的方法来设置默认参数的值。

我的第一次尝试是将默认值设置为未知对象(在包内)。然后当我加载包时,我会有一个外部脚本,它会为未知对象分配一个值。

但它看起来不是很干净,因为我正在用一个未知对象编译一个函数。

我的问题是我需要其他人使用这些函数,并且由于他们有很多参数,我希望代码尽可能简洁。在运行程序之前,可以通过配置脚本设置许多参数。

所以,例如,我在我的包中定义:

function_try <- function(x = VAL){
return(x)
}

我编译包并加载它,然后我有一个外部脚本(或从配置文件中读取)

VAL <- "hello"

然后函数的用户就可以运行了

function_try()

【问题讨论】:

    标签: r arguments config default r-package


    【解决方案1】:

    我会为此使用options。所以你的函数看起来像:

    function_try <- function(x = getOption("mypackage.default.value")) x
    

    在您的外部脚本中,您确保设置了选项值:

    options(mypackage.default.value = "hello")
    

    恕我直言,这是一个干净的解决方案,因为任何阅读您的函数的人都会第一眼看到某个选项值被用作默认值,并且清楚地了解如何在需要时覆盖该值。

    我还将在您的库onLoad 中定义一个备用值,以确保首先定义该值。然后,您甚至可以在函数中对此后备值做出反应,并在函数意识到外部脚本出于某种原因未提供新值时发出有意义的警告。

    【讨论】:

    • 然后我想知道是否可以使用 config 包并将配置值保存在 YAML 文件中,这可能比多次调用 options() 的脚本更具可读性。那么定义function_try &lt;- function(x = config::get("value"))会干净吗?
    • 取决于您的需求。如果您想为您的库添加新的依赖项,请选择config,因为它提供了额外的好处。但是,您不需要多次致电options。我会定义一个list/vector:mypackage.defaults = list(&lt;all your defaults&gt;) 并将其存储在选项中。您的函数签名将如下所示:function(x = getOption("mypackage.defaults")$default1)
    猜你喜欢
    • 2015-02-19
    • 1970-01-01
    • 2010-10-28
    • 2011-11-06
    • 2010-09-26
    • 2014-04-25
    • 1970-01-01
    相关资源
    最近更新 更多