2015-01-06 2 views
1
test <- list(a = list("first"= 1, "second" = 2), 
     b = list("first" = 3, "second" = 4)) 

В приведенном выше списке я хотел бы переназначить «первые» элементы равными, скажем, пятью. Этот цикл работ:переназначить значения в списке без цикла

for(temp in c("a", "b")) { 
    test[[temp]]$first <- 5 
} 

Есть ли способ сделать то же самое, используя векторизованную операцию (lapply и т.д.)? Ниже извлекает значения, но я не могу получить их переназначить:

lapply(test, "[[", "first") 
+0

Согласен. Плохое использование с моей стороны. – user2987808

ответ

3

Вы можете сделать это следующим образом:

test <- lapply(test, function(x) {x$first <- 5; x}) 
+0

Красивые. Примут в качестве ответа. – user2987808

+0

вам нужно назначить функцию для проверки работоспособности. test <- lapply (test, function (x) {x $ first <- 5; x}), иначе он просто печатает на экране. – user1945827

+0

Правильно, @ user1945827. Это верно для 99% функций R, поэтому я не включил его в свой ответ. –

4

Вот является vectorised один вкладыш с использованием unlist и relist:

relist((function(x) ifelse(grepl("first",names(x)),5,x))(unlist(test)),test) 
$a 
$a$first 
[1] 5 

$a$second 
[1] 2 


$b 
$b$first 
[1] 5 

$b$second 
[1] 4 
Смежные вопросы