0

给出了两个向量,ab。向量包含各种序列的起点 (a) 和终点 (b)。这些序列在目标向量中应设置为 1000 vec。我试图mapply用于此目的,但结果并不如预期。

a <- c(2,10,15)
b <- c(4,13,18)
vec <- sample(1:18,18)

mapply(function(a, b){
  vec[a:b] <- 1000; vec
},a,b)

我知道我可以vec[unlist(Map(":", a, b))] <- 1000从另一个线程做,但我想了解更多关于mapply它在这种情况下不能按预期工作的原因。

结果以矩阵而不是向量的形式出现,即更改不会保存到原始向量中。怎么可能做到这一点?可能是一个简单的修复(但我无法弄清楚文档或其他任何地方的任何内容)

      [,1] [,2] [,3]
[1,]   13   13   13
[2,] 1000    2    2
[3,] 1000   17   17
[4,] 1000   12   12
[5,]   14   14   14
[6,]    9    9    9
[7,]   16   16   16
[8,]    4    4    4
[9,]   15   15   15
[10,]   18 1000   18
[11,]    6 1000    6
[12,]    3 1000    3
[13,]   11 1000   11
[14,]    1    1    1
[15,]   10   10 1000
[16,]    7    7 1000
[17,]    5    5 1000
[18,]    8    8 1000
4

2 回答 2

0

mapply贯穿ab同时产生一系列结果。该序列的长度等于 和 的a长度b。在这种情况下,它是三个向量的序列,即具有 3 列的矩阵。

于 2015-10-28T22:21:41.253 回答
0

归功于 jeremycg。

有3种方法可以做到:

1) 如前所述,取消列出。可能是最好的方法

vec[unlist(Map(":", a, b))] <- 1000

2)使用全局赋值

mapply(function(a, b){vec[a:b] <<- 1000},a,b)

3)使用应用

vec[unlist(sapply(1:length(a), function(x) seq(from = a[x], to = b[x])))]<-1000
于 2015-10-30T08:51:36.023 回答