总之,na.rm = TRUE函数忽略了任何NA值。
如果na.rm = FALSE,则函数在计算中包含NA值。
sum_to_one <- function(x, na.rm = FALSE) {
x / sum(x, na.rm = na.rm)
}这来自于R4DS,学习函数,并在输入中将na.rm设置为true或false。上面的THe代码应该与
x / sum(x, na.rm = TRUE)但是na.rm在原始表达式中是真的,但是在函数输入中它被设置为na.rm = FALSE,然后在sum()表达式中设置为na.rm = na.rm。
我看到,更好的做法是通常执行函数(x,na.rm = FALSE) {},允许用户更改它,并与和的默认设置保持一致。这是正确的吗?
发布于 2020-06-14 17:25:41
许多基函数(如基R或任何特定包的基)都接受参数na.rm=,其中缺省值通常是FALSE。(有些函数使用useNA=或na.action,这取决于不同的操作,但我们将忽略这些操作。)
高级函数(用户定义和/或其他包)也可能定义此参数,然后将其传递给其他函数。例如:
parent_func <- function(x, ..., na.rm = FALSE) {
# something important
mu <- mean(x, na.rm = na.rm)
sigma <- sd(x, na.rm = na.rm)
(mu - x) / sigma
}一个前提是,如果您打算删除/忽略函数的一部分的NA值,您可能会在其他地方(或全部)使用它。
在本例中,在对mean(x, na.rm = na.rm)的调用中,左na.rm引用了mean定义中名为na.rm的参数。右na.rm指的是parent_func的同名参数。
定义这个父函数的另一种方法(为了区分变量)可以是:
parent_func <- function(x, ..., NARM = FALSE) {
# something important
mu <- mean(x, na.rm = NARM)
sigma <- sd(x, na.rm = NARM)
(mu - x) / sigma
}使用na.rm=而不是这个NARM=的优点可能是一致性(尽管这并不总是R在所有函数中的优势之一)。许多用户可能比其他用户更直观地熟悉na.rm=参数名称、用途和效果。
编辑
--我发现,更好的做法是通常执行函数(x,na.rm = FALSE) {},允许用户更改它,并与和和均值的默认设置保持一致。这是正确的吗?
我相信是这样的。通常,我发现删除丢失的数据应该是用户的明确行为,而不是函数的默认操作。也就是说,如果丢失的数据意味着一个更大的问题,那么默认为na.rm=FALSE将很快向用户表明出了什么问题;na.rm=TRUE将掩盖这个问题,并在可能根本没有NA的情况下提出有效的结果。对于“较小的”函数(例如,mean、sum)来说,这是正确的,因此它的逻辑应该向外传递到封装函数。
https://stackoverflow.com/questions/62375724
复制相似问题