【问题标题】:Drawbacks of using NULL as function argument使用 NULL 作为函数参数的缺点
【发布时间】:2022-01-01 11:18:32
【问题描述】:

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= FASLElevel 参数是多余的。因此,对我来说,在一个论点中总结这两种信息是很直观的。所以我对函数的定义是这样的:

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 的包上工作。用一个众所周知的函数来解释我的意思会更容易。

【问题讨论】:

  • 您仍然有一个 if 和 2 个参数:您的函数首先测试 is.null(lev),如果它是 TRUE,则将 se 设置为一个值,如果没有将其设置为另一个值。你测试一个参数的值来决定另一个,没有任何收获。此外,用户有时可能想要 SE 频段,而其他时候则不需要,但总是具有相同的级别。 se 值将作为变量传递,level 保持不变。
  • 上述评论是见仁见智,问题也是如此。也许这是一个更适合包维护者的问题。
  • @Rui 这与 geom_smooth 无关。我在一个我想以这种方式使用 NULL 的包上工作。用一个众所周知的函数来解释我的意思会更容易。
  • NULL 作为默认参数值有其用途。它避免引用缺失的论点。也可以测试missing(arg)
  • 至于评论的最后一部分,“什么时候有人想将 se 设置为 FALSE 但提供某种级别?”,答案是“从不”。但是,如果您事先不知道是否需要信心带怎么办? 95% 是一个频繁的置信水平,假设你一劳永逸地设置它然后调用函数设置只se 或分配一个变量值FALSE/TRUE 然后在函数中使用变量 .

标签: r function null arguments


【解决方案1】:

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

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

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

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

【讨论】:

  • @mental cost:决定的数量相同,但要记住的参数名称的数量翻了一番。我在一个包上工作,对于一个函数,精神成本是记住 10 个而不是 5 个参数名称。
猜你喜欢
  • 2015-07-20
  • 2016-05-17
  • 1970-01-01
  • 2020-05-13
  • 1970-01-01
  • 2021-05-08
  • 1970-01-01
  • 2013-12-02
  • 1970-01-01
相关资源
最近更新 更多