2013-04-11 2 views
3

Хорошо, вот ситуация: У меня есть следующий список массивов:Замена элементов массивов в списке (R)

N <- c('A', 'B', 'C') 
ll <- sapply(N, function(x) NULL) 
ll <- lapply(ll, function(x) assign("x", array(0, dim = c(2,2)))) . 

Теперь я хочу заменить, скажем, элемент в положении [1, 1] в этих массивах по заданной величине, скажем 10. Что я делаю, следуя этому вопросу here. То есть, я делаю следующее:

x <- lapply(ll, function(x) {x[1,1] <- 10}), 

который должен сделать ха список из трех 2х2 массивов с [1,1] элемент, равный 10, а все остальные равны 0. Вместо этого, я м видя это:

> x <- lapply(ll, function(x) {x[2,1] <- 10}) 
> x 
$A 
[1] 10 

$B 
[1] 10 

$C 
[1] 10 

Любые идеи о том, что здесь происходит?

ответ

4

Вы не возвращаете весь вектор. Таким образом, возвращается последний аргумент. То есть, когда вы делаете,

x <- lapply(ll, function(x) {x[2,1] <- 10}) 

Вы намерены сказать:

x <- lapply(ll, function(x) {x[2,1] <- 10; return(x)}) 

Если вы не указываете возвращаемое значение, последнее присвоенное значение по умолчанию возвращается который 10. Вместо этого вы следует использовать return(x) или, что эквивалентно просто x следующим образом:

x <- lapply(ll, function(x) {x[2,1] <- 10; x}) 
# $A 
#  [,1] [,2] 
# [1,] 0 0 
# [2,] 10 0 
# 
# $B 
#  [,1] [,2] 
# [1,] 0 0 
# [2,] 10 0 
# 
# $C 
#  [,1] [,2] 
# [1,] 0 0 
# [2,] 10 0 
+0

* facepalm * Спасибо связка! –

+0

Кстати, это также причина, по которой второе присваивание работает без вызова «присваивания», т. Е. 'Ll <- lapply (ll, function (x) array (0, dim = c (2,2)))? –

0

apply Хотя, как правило, предпочтительнее, здесь является альтернативой, просто ради ч aving one:

for (i in 1:3) ll[[i]][2,1] <- 10 
Смежные вопросы