【问题标题】:Two equivalent functions have two different outputs两个等效函数有两个不同的输出
【发布时间】:2017-07-15 18:09:27
【问题描述】:

以下两个前两个函数查找向量x中的所有NA并将其替换为y

现在第一个函数:

f <- function(x, y) {
    is_miss <- is.na(x)
    x[is_miss] <- y
    message(sum(is_miss), " missings replaced by the value ", y)
    x
}
x<-c(1,2,NA,4,5)
# Call f() with the arguments x = x and y = 10
f(x=x,y=10)

#result is
1 missings replaced by the value 10
[1]1 2 10 4 5

第二个功能:

 f <- function(x, y) {
    is_miss <- is.na(x)
    x[is_miss] <- y
    cat(sum(is.na(x)), y, "\n")
    x
 }
x<-c(1,2,NA,4,5)
# Call f() with the arguments x = x and y = 10
f(x=x,y=10)

#result is
0 10
[1]1 2 10 4 5

这两个函数之间的唯一区别是每个函数中的 message/cat 行。为什么第一个函数打印 1 缺失值替换为值 10 但第二个打印 0 10 而不是 1 10 (它们都表示向量中的 1 NA 替换为值 10)。

【问题讨论】:

  • x 向量在哪里?
  • 它们不等价:在第一个函数中使用sum(is_miss),而在第二个函数中,在上一行更改x 后使用sum(is.na(x))
  • 刚刚运行了这两个函数,它们都抛出了同样的错误。 @RichScriven 暗示:Error in f(x = x, y = 10) : object 'x' not found。所以我将is.na 更改为missing 并且错误发生了变化,但功能仍然不起作用。错误变成了Error in x[is_miss] &lt;- y : object 'x' not found
  • @RichScriven 我的错。 x
  • @RuiBarradas 我将第二个函数更改为“sum(is_miss)”,结果是一样的。所以这一定是问题所在。但不是 'is_miss = is.na(x)' 吗?为什么它们会产生不同的结果?

标签: r message cat


【解决方案1】:

在您的第二个函数中,x[is_miss] &lt;- y 替换了 NA。当您在cat(sum(is.na(x)), y, "\n") 中重新检查他们的计数时,它会与之前的语句不同。尝试用cat(sum(is_miss), y, "\n") 替换第二个函数中的cat(sum(is.na(x)), y, "\n")

【讨论】:

  • 但是' is_miss
  • 我尝试了sum(is_miss)sum(is.na(x)),它们都打印了1。我仍然认为它们是同一回事。
  • &lt;- 运算符表示赋值,而不是绑定。如果将is.na(x) 分配给is_miss,然后更改xis_miss 将不会自动重新计算。这就是您的第二个功能中发生的事情。首先,将x 的 NA 向量存储(复制)到is_miss。然后用复制的y 替换x 的NA,将NA 转换为常规值。此时,如果x 中有任何 NA,is.na(x)is_miss 的值将有所不同,因为它们都已被替换。 is_miss 不会反映这一点,除非您在替换后再次 is_miss &lt;- is.na(x)
【解决方案2】:

Eva,你没看错。在下面的代码中,我希望通过显示 3 个不同版本的函数来让事情变得清晰。我将它们命名为 fgh

#The first function
f <- function(x, y) {
    is_miss <- is.na(x)
    x[is_miss] <- y
    message(sum(is_miss), " missings replaced by the value ", y)
    x
}
x<-c(1,2,NA,4,5)
# Call f() with the arguments x = x and y = 10
f(x=x,y=10)

#result is
1 missings replaced by the value 10
[1]  1  2 10  4  5

#The second function:
g <- function(x, y) {
    is_miss <- is.na(x)
    x[is_miss] <- y
    cat(sum(is.na(x)), y, "\n")
    x
}
x<-c(1,2,NA,4,5)
# Call g() with the arguments x = x and y = 10
g(x=x,y=10)
0 10 
[1]  1  2 10  4  5

#The third function:
h <- function(x, y) {
    is_miss <- is.na(x)
    x[is_miss] <- y
    cat(sum(is_miss), y, "\n")  # ONLY DIFFERENCE FROM 'g'
    x
}
x<-c(1,2,NA,4,5)
# Call h() with the arguments x = x and y = 10
h(x=x,y=10)
1 10 
[1]  1  2 10  4  5

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-18
    相关资源
    最近更新 更多