2012-03-06 8 views
0

La boucle ci-dessous modifie bloc. Est-ce que sapply() peut atteindre le même résultat?sapply et environnements

Ou en d'autres termes, est-ce que sapply() peut mettre à jour des variables dans l'environnement de base? J'ai essayé d'utiliser assign() mais sans succès. Je vous remercie.

n <- 100 
fencePosts <- c(17,34) 
bloc <- rep(0,n) 
for (i in 1:length(fencePosts)){ 
    bloc[fencePosts[i]:n] = i 
} 
table(bloc) 

Je pensais à quelque chose comme la ligne suivante, mais bien sûr bloc est hors de portée (bien que je ne sais pas pourquoi cela ne soulève pas un « bloc introuvable » erreur).

zilch <- sapply(1:length(fencePosts),function(i)bloc[fencePosts[i]:n] = i) 

Répondre

1

Je ne sais pas comment il est casher aux R-perts, mais vous pouvez faire

zilch <- sapply(1:length(fencePosts),function(i)bloc[fencePosts[i]:n] <<- i) 
+0

Je le fais parfois, mais seulement quand je peux contenir l'objet attribué à, 'bloc' et l'appel' sapply() 'dans une petite fonction, qui prend' bloc', etc comme argument et retourne alors le 'bloc' modifié –

3

Je n'ai pas vu sapply utilisé de cette façon, et même si possible, je suis pas sûr que ce soit une bonne idée. L'utilisation principale de sapply consiste à effectuer la même tâche sur différents éléments d'une liste, puis à collecter les résultats de manière utile. Cela ne correspond pas à cette utilisation, donc je pense que le code serait difficile à lire et à maintenir, même si c'est possible.

Dans ce cas particulier, pourquoi ne pas utiliser rep?

bloc <- rep(seq_len(length(fencePosts)+1), diff(c(1,fencePosts,n+1)) 

En ce qui concerne les raisons pour lesquelles cela ne fonctionne pas, cela a trait à la portée; une bonne référence est celle de John Fox: http://cran.r-project.org/doc/contrib/Fox-Companion/appendix-scope.pdf.

+0

Merci pour l'exemple et le lien. –

0

Dans ce cas, vous n'avez vraiment besoin d'aucune affectation dans la boucle ou à l'intérieur sapply.

sapply(1:n, function(u) sum(u >= fencePosts)) 
Questions connexes