使用 NULL 作为函数参数的缺点

Drawbacks of using NULL as function argument

考虑 ggplot2 中的 geom_smooth(),我们可以在其中设置是否要查看置信区间(se 参数)以及区间的宽度(level 参数) .例如:

df <- data.frame(x= rnorm(100), y= rnorm(100))
library(ggplot2)
ggplot(df, aes(x ,y)) + geom_smooth(se= TRUE, level= .95)

我认为不需要两个单独的参数:如果我们设置一些 level,我们显然希望看到置信区间。所以在这种情况下 se 参数是多余的。另一方面,如果我们选择 se= FASLE,则 level 参数是多余的。因此,对我来说,将这两种信息总结为一个论点是很直观的。所以我对函数的定义是这样的:

my_smooth <- function(lev, ...){
if(is.null(lev)){
geom_smooth(se= FALSE)
} else{
geom_smooth(se= TRUE, level= lev)
}
}

所以在 my_smooth() 中有一个参数,我们可以通过选择 NULL 来决定不查看置信区间,或者我们输入我们想要查看的水平。当然,如果需要,我们可以添加 lev= .95 作为默认值。

在我看来,这种方法非常简单,避免了像 geom_smooth(se= FALSE, level= .95) 这样的悖论情况。在函数参数中使用 NULL 作为选项是否有缺点,就像在 my_smooth() 中所做的那样? IE。使用 NULL 作为“没有意识到这个论点”是不好的做法吗?

编辑

问题与 geom_smooth() 无关。我正在处理一个我想以这种方式使用 NULL 的包。用一个众所周知的函数更容易解释我的意思。

您的my_smooth函数要求用户指定levgeom_smooth 方法允许用户接受 selevel 参数的默认值,或者只更改其中一个默认值。

selevel 参数的定义也更容易记录。您的 lev 参数意味着两件事:是否绘制波段,以及如何绘制。幸运的是,在这种情况下,“不绘制它”的选择不需要数值参数,但在一个参数代表二元选择的其他情况下,其他参数可能适用于这两种情况。 geom_smooth 选择与这些其他情况一致,因为参数具有明确的含义。

一个参数有时无关紧要这一事实是一个很小的成本:您不是为每个参数付出(精神上的)代价,而是为每个决定付出代价。您仍在做出两个决定,因此您的解决方案并不便宜。

在其他情况下,一个参数比两个好。例如,R 允许您根据另一个参数的值指定一个参数的默认值。 dgamma/rgamma 等函数使用它来允许您指定分布的 ratescale,但不能同时指定两者(因为 rate*scale = 1)。这被认为很方便,因为有些人习惯于与一个人一起工作,而另一个人与另一个人一起工作,但我认为这只会让每个人感到困惑,使文档变得更加复杂,并让人想知道为什么 rnorm 不允许你指定方差而不是 s.d.?