【问题标题】:Unwanted sorted behavior on result of vector-concatenation function矢量连接函数结果的不需要的排序行为
【发布时间】:2014-03-21 12:10:11
【问题描述】:

我应用一个简单的匿名函数在序列 1:5 上返回 c(x,x+5)

我希望看到 c(1,6,2,7,3,8,4,9,5,10) (子结果的串联),但结果向量被意外排序。这是怎么回事?我该如何预防?

> (function(x) c(x,x+5)) (1:5)
 [1]  1  2  3  4  5  6  7  8  9 10

但是在每个单独的参数上应用函数是正确的:

> (function(x) c(x,x+5)) (1)
[1] 1 6
> (function(x) c(x,x+5)) (2)
[1] 2 7
...
> (function(x) c(x,x+5)) (5)
[1]  5 10

【问题讨论】:

  • 也许我没有得到你的问题,但结果似乎符合我的预期,因为 + (和你的函数)在整个 x 向量上运行。为了得到你想要的东西: unlist(lapply(1:5, function(x) c(x, x+5)))
  • @vodka:太好了,请发帖作为答案。 a)这是否有效地矢量化?如果没有,还不如写一个for循环b)是否没有(矢量化)方法来确保优先顺序是先将函数应用于单个args,然后将子结果连接起来?
  • 详细说明,当输入 x1:5 时,它与 1:5+5 连接,所以你的输出是 c(1:5,6:10) 。这是操作顺序的问题。
  • @Carl-Witthoft,是的,我已经根据伏特加的评论将其标记为 [tag:]operator-precedence。但我希望能够在这里控制优先顺序。

标签: r function sorting vectorization operator-precedence


【解决方案1】:

另一种方法:

bar <- function(x) {
    as.vector(matrix(c(x,x+5),nrow=2,byrow=TRUE))
}

【讨论】:

  • sapply(...) 也产生 5x2
【解决方案2】:

以这种方式工作:

   unlist(lapply(1:5, function(x) c(x, x+5)))

【讨论】:

    【解决方案3】:

    你可以试试这个来欺骗操作顺序:

    foo<-function(x) {   
          bar<-cbind(x,x+5)  
          as.vector(t(bar))
    
    }
    foo(1:5)
    

    或单行形式:

    (function(x) as.vector(t(cbind(x,x+5)))) (1:5)
    

    【讨论】:

    • 感谢大家的回答。我怀疑cbind 的性能优于lapply 的可扩展性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多