【问题标题】:R, why are these assignments' results differentR,为什么这些作业的结果不同
【发布时间】:2013-11-19 18:42:26
【问题描述】:

我是 R 的初学者。我对以下代码有疑问。

f <- function(x,y){
  x+y[1]+y[2]
}

y <- matrix(1:8, ncol=2);y
x <- 1:4
i <- 1:4
v1 <- f(x[i], y[i,])
v2 <- NULL; v2[i] <- f(x[i], y[i,])
v3 <- NULL; for(i in 1:4){v3[i] <- f(x[i], y[i,])}
v1; v2; v3

v1 和 v2 的结果相同。 v3 是我想要的。但是为什么我不能只使用 v1 或 v2 的命令呢?为什么它们不同?有没有办法稍微修改 v1 或 v2 以获得所需的结果?提前非常感谢!

【问题讨论】:

    标签: r function matrix assignment-operator


    【解决方案1】:

    这里的问题是你的函数f 没有在第二个参数中向量化。如果您在函数内显式评估加数,您可以看到发生了什么:

    > x[i]
    [1] 1 2 3 4
    > y[i,][1]
    [1] 1
    > y[i,][2]
    [1] 2
    

    所以你可以看到,f(x[i],y[i,]) 与评估 1:4 + 1 + 2 是一样的:

    > 1:4 + 1 + 2
    [1] 4 5 6 7
    > f(x[i],y[i,])
    [1] 4 5 6 7
    

    如果您希望第二个参数中包含矩阵,则可以编写函数的矢量化版本,如 @James 所述。另一种选择是将y 转换为数据框:

    > f(x,data.frame(y))
      X1
    1  7
    2 10
    3 13
    4 16
    

    这样做的原因是数据框表示为列列表,而矩阵表示为具有维度属性的数组。所以y[1] 会给你y 的第一个元素,而data.frame(y)[1] 会给你第一列:

    > y[1]
    [1] 1
    > data.frame(y)[1]
      X1
    1  1
    2  2
    3  3
    4  4
    

    【讨论】:

      【解决方案2】:

      问题来自您对f 的实现。矩阵子集的工作方式意味着您返回相同的矩阵并始终为 x 中的每个值选择前两个元素。

      如果您以更加矢量化的方式编写它,它将按您的意愿工作:

      f2 <- function(x,y) x+y[,1]+y[,2]
      f2(x,y)
      [1]  7 10 13 16
      

      【讨论】:

        猜你喜欢
        • 2018-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多