为什么 sapply() 和 options() "undesirable"?
Why are sapply() and options() "undesirable"?
Jim Hester 的“lintr”包包含许多不同的 R 短绒。README for the package 以这种方式描述了其中一种短绒:
undesirable_function_linter:
report the use of undesirable functions, e.g. options or sapply and suggest an alternative.
我很惊讶。我用 R 很多年了,options()
和 sapply()
也用了很多年。是什么让他们不受欢迎?还有更好的选择吗?
我知道 getOption()
,但它不能替代 options()
。我还知道 *apply()
变体、Map()
和 Tidyverse map
函数。在我看来,Tidyverse 函数总体上确实比 sapply()
或 Map()
更好——我更喜欢 Tidyverse 函数中的默认值和参数顺序——但我不会想到调用 sapply()
“不受欢迎。”
如果您查看该函数的 header,
function(fun = default_undesirable_functions)
你看到它在 default_undesirable_functions
中记录了它的选择,如果你看那个 object,你会看到:
...
$options
[1] "use withr::with_options()"
...
$sapply
[1] "use vapply() or lapply()"
...
从备选方案中,你可以猜到为什么作者认为那些功能“不可取”:
options()
不好,因为它有全局副作用。 withr::with_options()
替代方案保留对本地选项的任何更改。
sapply()
不好,因为 vapply()
更安全(如 ?sapply
中所述)。
Jim Hester 的“lintr”包包含许多不同的 R 短绒。README for the package 以这种方式描述了其中一种短绒:
undesirable_function_linter:
report the use of undesirable functions, e.g. options or sapply and suggest an alternative.
我很惊讶。我用 R 很多年了,options()
和 sapply()
也用了很多年。是什么让他们不受欢迎?还有更好的选择吗?
我知道 getOption()
,但它不能替代 options()
。我还知道 *apply()
变体、Map()
和 Tidyverse map
函数。在我看来,Tidyverse 函数总体上确实比 sapply()
或 Map()
更好——我更喜欢 Tidyverse 函数中的默认值和参数顺序——但我不会想到调用 sapply()
“不受欢迎。”
如果您查看该函数的 header,
function(fun = default_undesirable_functions)
你看到它在 default_undesirable_functions
中记录了它的选择,如果你看那个 object,你会看到:
...
$options
[1] "use withr::with_options()"
...
$sapply
[1] "use vapply() or lapply()"
...
从备选方案中,你可以猜到为什么作者认为那些功能“不可取”:
options()
不好,因为它有全局副作用。withr::with_options()
替代方案保留对本地选项的任何更改。sapply()
不好,因为vapply()
更安全(如?sapply
中所述)。