Provavelmente é uma duplicata, mas não consigo encontrar esse caso específico.
Digamos que eu tenha duas listas:
list1 <- as.list(c(5, 8, 9))
list2 <- as.list(c(8, 10, 11))
Eu sei como aplicar uma função a uma lista. Digamos que eu queira aplicar o seguinte a list1
:
lapply(list1, function(x){x+100})
Mas e se eu só quiser aplicar tal função list1
quando o valor correspondente em list2
for >=10
? Então meu resultado é:
[[1]]
[1] 5
[[2]]
[1] 108
[[3]]
[1] 109
E mais ainda, como posso somar 100 ao valor em list1
e subtrair o valor em list2
somente quando o valor em list2
for >=10
?
Algo como o seguinte, que obviamente não funciona:
lapply(list1, list2, function(x,y){if (y>=10) x+100-y})
Obrigado!
Acho que você está procurando por
Map()
, que émapply()
sem simplificação:Por razões que imagino que sejam conhecidas apenas pelos desenvolvedores de R, ao contrário de
lapply()
,sapply()
etapply()
, a função é o primeiro argumento demapply()
eMap()
.Se você quiser ser mais sofisticado, pode remover a
if()
declaração e definir a função como,\(x1, x2) x1 + 100 * (x2 >= 10)
mas, pessoalmente, acho que a falta de explicitude a torna menos compreensível.Claro que você também pode fazer isso
ifelse(list2 >= 10, unlist(list1) + 100, list1)
neste caso, masMap()
é mais geral.Seu segundo exemplo poderia ser expresso como
Map(\(x, y) if (y >= 10) x + 100 - y else x, list1, list2)
.Dado o exemplo do brinquedo, não vejo por que usamos um formato de lista. As coisas ficam mais fáceis se trabalharmos com vetores em vez disso:
e então aplicar um vetor totalmente
Nota. Notação retirada da solução do usuário @SamR .
Uma variante de uso
Map