使用 mapply 匹配两个向量以创建序列

Matching two vectors with mapply to create sequences

给出了两个向量,ab。向量包含各种序列的起点 (a) 和终点 (b)。这些序列应在目标向量 vec 中设置为 1000。为此,我尝试使用 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

mapply 同时运行 ab 并生成一系列结果。这个序列的长度等于ab的长度。在这种情况下,它是三个向量的序列,即具有 3 列的矩阵。

感谢 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