使用 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
函数要求用户指定lev
。 geom_smooth
方法允许用户接受 se
和 level
参数的默认值,或者只更改其中一个默认值。
se
和 level
参数的定义也更容易记录。您的 lev
参数意味着两件事:是否绘制波段,以及如何绘制。幸运的是,在这种情况下,“不绘制它”的选择不需要数值参数,但在一个参数代表二元选择的其他情况下,其他参数可能适用于这两种情况。 geom_smooth
选择与这些其他情况一致,因为参数具有明确的含义。
一个参数有时无关紧要这一事实是一个很小的成本:您不是为每个参数付出(精神上的)代价,而是为每个决定付出代价。您仍在做出两个决定,因此您的解决方案并不便宜。
在其他情况下,一个参数比两个好。例如,R 允许您根据另一个参数的值指定一个参数的默认值。 dgamma/rgamma
等函数使用它来允许您指定分布的 rate
或 scale
,但不能同时指定两者(因为 rate*scale = 1
)。这被认为很方便,因为有些人习惯于与一个人一起工作,而另一个人与另一个人一起工作,但我认为这只会让每个人感到困惑,使文档变得更加复杂,并让人想知道为什么 rnorm
不允许你指定方差而不是 s.d.?
考虑 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
函数要求用户指定lev
。 geom_smooth
方法允许用户接受 se
和 level
参数的默认值,或者只更改其中一个默认值。
se
和 level
参数的定义也更容易记录。您的 lev
参数意味着两件事:是否绘制波段,以及如何绘制。幸运的是,在这种情况下,“不绘制它”的选择不需要数值参数,但在一个参数代表二元选择的其他情况下,其他参数可能适用于这两种情况。 geom_smooth
选择与这些其他情况一致,因为参数具有明确的含义。
一个参数有时无关紧要这一事实是一个很小的成本:您不是为每个参数付出(精神上的)代价,而是为每个决定付出代价。您仍在做出两个决定,因此您的解决方案并不便宜。
在其他情况下,一个参数比两个好。例如,R 允许您根据另一个参数的值指定一个参数的默认值。 dgamma/rgamma
等函数使用它来允许您指定分布的 rate
或 scale
,但不能同时指定两者(因为 rate*scale = 1
)。这被认为很方便,因为有些人习惯于与一个人一起工作,而另一个人与另一个人一起工作,但我认为这只会让每个人感到困惑,使文档变得更加复杂,并让人想知道为什么 rnorm
不允许你指定方差而不是 s.d.?