在 R 中:使用 lapply 替换矩阵的对角线元素

use*_*378 1 replace r lapply diagonal

我想替换列表中包含的矩阵的对角线元素。

w <- matrix(rnorm(25), 5)
t <- matrix(seq(1, 25, 1), 5)
s <- list(w, t)
Run Code Online (Sandbox Code Playgroud)

如果我尝试这个,它会起作用。

diag(s[[1]]) <- rep(0, 5)
diag(s[[2]]) <- rep(0,5)
Run Code Online (Sandbox Code Playgroud)

但如果我尝试这样做,我会收到一条错误消息。

lapply(1:2, function(i){diag(s[[i]]) <- rep(0, nrow(s[[i]]))})
Run Code Online (Sandbox Code Playgroud)

所以有两件事是错误的。首先是“lapply-loop”。第二个是nrow(s[[i]])。但为什么。我不明白这一点。谢谢。

Jil*_*ina 5

这应该有效

lapply(s, function(x) { diag(x) <- 0; x})
Run Code Online (Sandbox Code Playgroud)

这相当于

lapply(s, function(x) {
  diag(x) <- 0
  return(x)})
Run Code Online (Sandbox Code Playgroud)

请注意,这是有效的,因为匿名函数有一个要返回的对象,它在后面;或中明确指出return(x)