【问题标题】:Why are these functions different?为什么这些功能不同?
【发布时间】:2018-06-15 15:16:54
【问题描述】:

我不确定为什么我会从这些函数中得到不同的结果。

change_it1 <- function(x) {
  x[x == 5] <- -10
}
change_it2 <- function(x) {
  x[x == 5] <- -10
  x
}
x <- 1:5
x <- change_it1(x)
x
x <- 1:5
x <- change_it2(x)
x

为什么这两个函数不以相同的方式改变 x?

x[x==5] <- -10

【问题讨论】:

  • 在第一种情况下,你得到赋值的值,在第二种情况下,你得到赋值后'x'的值。它在这两种情况下都改变了“x”,但是你只返回赋值而不是对象“x”
  • 不确定,但我认为 x 的值在您尝试运行第二个时发生了变化,它具有不同的值。尝试为第二个变量使用不同的变量
  • @Sam 在函数中并非如此。值在本地更改。此外,OP 在每次运行之前都会更改变量“x”

标签: r


【解决方案1】:

赋值运算符&lt;- 实际上是一个具有改变变量值的副作用的函数。但作为一个函数,它也无形地返回右侧用于赋值的值。我们可以通过print() 强制看到不可见的值。例如

x <- 1:2
print(names(x) <- c("a","b"))
# [1] "a" "b"

或再次使用子集

print(x[1] <- 10)
# [1] 10
print(x[2] <- 20)
# [1] 20
x
#  a  b 
# 10 20 

在每种情况下查看赋值返回的右侧值而不是 x 的更新值。函数将返回最后一个表达式返回的任何值。在第一种情况下,您将返回赋值返回的值(即值 -10),而在第二种情况下,您将显式返回更新后的 x 值。

这两个函数都以相同的方式更改 x(至少在函数的范围内),但在这两种情况下,您都没有返回更新后的 x 值。

【讨论】:

    猜你喜欢
    • 2015-12-07
    • 2016-01-19
    • 1970-01-01
    • 2022-08-09
    • 2019-08-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2013-03-20
    相关资源
    最近更新 更多