2015-10-26 65 views
1

lapply不能按预期工作。我得到了以下功能:带lapply和seq_along的矩阵索引

testing <- function(x){ 
    x <- lapply(seq_along(x), function(i) x[[i]][,2] <- c(88,88,88)) 
    return(x) 
} 

和测试矩阵的列表:

xl <- list(matrix(1:9,3,3),matrix(2:10,3,3)) 

输出为:

[[1]] 
[1] 88 88 88 

[[2]] 
[1] 88 88 88 

为什么会出现这种情况?我预计第二列将被88个替代,而不是由88个向量替代的矩阵。我必须在这里错过一些东西。

+1

@Frank感谢,编辑。 – EDC

回答

2

你需要

testing <- function(x){ 
     lapply(seq_along(x), function(i) {x[[i]][,2] <- 88 
            x[[i]]})} 
testing(list) 
#[[1]] 
#  [,1] [,2] [,3] 
#[1,] 1 88 7 
#[2,] 2 88 8 
#[3,] 3 88 9 

#[[2]] 
#  [,1] [,2] [,3] 
#[1,] 2 88 8 
#[2,] 3 88 9 
#[3,] 4 88 10 

或者我们循环list,第二列更改为88,并返回列表元素。

lapply(list, function(x) {x[,2] <- 88; x}) 

或者正如@Frank提到的,我们可以使用一个for循环和分配的每个list元件的第二列88.

for (j in seq_along(list)) list[[j]][, 2] <- 88 
+0

好,所以主要的改变似乎是最后加入'x [[i]]',对吗? – EDC

+0

@EDC主要的变化是我们需要为(j在seq_along(x))x [[j]] [,2] < - 88'上的'x [[i]]' – akrun

+0

'和return(x )是另一种选择,也许更接近OP的最初想法。 – Frank