R 包检查尚未运行的函数的参数的最佳做法是啥?
Posted
技术标签:
【中文标题】R 包检查尚未运行的函数的参数的最佳做法是啥?【英文标题】:What is the R package's best practice to check arguments of functions that have not run yet?R 包检查尚未运行的函数的参数的最佳做法是什么? 【发布时间】:2021-02-07 02:47:49 【问题描述】:问题定义
在包中,用户可以选择不同的选项并根据这些选项传递其他参数。由于这些函数在计算上具有挑战性,因此我想在进行任何大规模运行之前检查用户是否传递了所需的参数。例如,在以下代码中:
FunOne <- function(x, y, z,...)
FunTwo(x,y,z, ...) # computationally challenging
FunThree(x,y,z, ...)
FunThree
的输入取决于 z
参数。如果z="option 1"
,则应传递参数arg1 = 100
。如果z = "option 2"
,arg2 = "value"
,应该通过。
可能的解决方案
我知道每个选项所需的参数。我想将它们作为全局变量加载,然后仔细检查它们是否通过(例如,pkg.env <- new.env(parent = emptyenv()
)。我可以在一个单独的函数中执行此操作,并在分析开始时运行该函数。
我的问题
-
这是在 R 包中仔细检查参数的好习惯吗?
如何在加载包时在后台运行函数。请给我一个包端解决方案,而不是用户端解决方案(例如,~/.Rprofile)。我希望在没有用户干预的情况下发生这种情况。
【问题讨论】:
可能将其拆分为多个函数,例如方法 1 有自己的函数,然后只需使用 match.arg() 或 rlang arg_match 作为基于选择的参数,并使用简单的 if 检查和东西 谢谢@Bruno,我想我做不到。我想在运行函数之前对其进行测试,因为许多参数是附加参数,并且可能会遗漏一两个必需参数(基于其他选项)。因此,我需要在开始任何重要计算之前检查它们。 拥有全局变量不是一个好习惯。使用 stopifnot() 断言正确的输入是一种很好的做法。 【参考方案1】:我认为您的建议可行。我不完全理解全局变量的价值/目的,通常会尽量避免这样的事情。但严格来说,它会起作用。似乎缺少两件事:
list(...)
会将...
值放在一个列表中,以便您检查它们。请参阅...
的帮助。
.onAttach
将在包加载时运行。这是一个例子:
.onAttach <- function(...)
# Do something when the package loads
还要注意,您甚至不需要 .onAttach 来填充环境变量。您可以在代码文件的顶部执行此操作。
【讨论】:
以上是关于R 包检查尚未运行的函数的参数的最佳做法是啥?的主要内容,如果未能解决你的问题,请参考以下文章