2017-04-06 2 views
1

Quand je cours une longue routine dans R, est-il possible de montrer les étapes intermédiaires?Comment puis-je montrer les étapes intermédiaires d'une routine longue dans R?

Par exemple, je travaille avec une routine pour la construction de versions aléatoires d'une matrice originale, basée sur des modèles null (paquet biparti):

#Build N randomized version of the matrix contained in data  
nulls <- nullmodel(data, N=1000, method=3) 

#Calculate the same network metric for all N randomized matrices 
modules.nulls <- sapply(nulls, computeModules, method = "Beckett") 

En fonction de la puissance de traitement de l'ordinateur et la taille de N, il faut beaucoup de temps pour terminer la routine. Je voudrais inclure un code pour montrer sur la console toutes les étapes intermédiaires pour les première et deuxième parties de la routine. Quelque chose comme "matrice 1, matrice 2 ... matrice N".

Pourriez-vous s'il vous plaît aide-moi? Je vous remercie!

Répondre

4

1) chat Vous pouvez ajouter cat, message ou print déclarations à la fonction.

2) trace ou si vous ne voulez pas modifier la fonction elle-même alors trace comme ceci:

# test function 
fun <- function(x) length(x) 

trace(fun, quote(print(i <<- i + 1))) 

i <- 0 
out <- sapply(iris, fun) 

donnant:

Tracing FUN(X[[i]], ...) on entry 
[1] 1 
Tracing FUN(X[[i]], ...) on entry 
[1] 2 
Tracing FUN(X[[i]], ...) on entry 
[1] 3 
Tracing FUN(X[[i]], ...) on entry 
[1] 4 
Tracing FUN(X[[i]], ...) on entry 
[1] 5 

Pour inverser cette utilisation untrace(fun).

3) wrapper Une autre possibilité consiste à créer un wrapper. Le flush.console est facultatif et a pour effet d'éviter la mise en mémoire tampon de la console afin que vous puissiez voir la sortie immédiatement.

wrap_fun <- function(x) { print(i <<- i + 1); flush.console(); fun(x) } 

i <- 0 
out <- sapply(iris, wrap_fun) 

4) tkProgressBar Une approche peu colombophile est d'utiliser une barre de progression. Cet exemple de code utilise le package tcltk inclus dans toutes les distributions R standard (vous n'avez donc pas besoin de le télécharger et de l'installer - il est déjà présent et l'instruction library est suffisante pour le charger).

library(tcltk) 

fun2 <- function(x) Sys.sleep(2) # test function 
wrap_fun2 <- function(x) { 
    i <<- i + 1 
    setTkProgressBar(bar, i, label=i) 
    fun2(x) 
} 

bar <- tkProgressBar("Progress", max = 5) 
i <- 0 
out <- sapply(iris, wrap_fun2) 
close(bar) 

Voir aussi ?txtProgressBar et ?winProgressBar (Windows uniquement) ainsi que le paquet de progrès pour d'autres barres de progression disponibles.

+0

Cher Grothendieck, merci beaucoup pour la réponse. Cependant, j'ai essayé d'utiliser les codes que vous avez suggérés, mais cela n'a pas fonctionné. J'utilise deux fonctions (nullmodel et computeModules) qui sont construites dans un paquet R (bipartite), donc je ne peux pas le modifier. Si j'utilise la première solution proposée (trace), comment puis-je adapter mon script? Je vous remercie. – Marco

+0

Vous pouvez tracer des fonctions dans des packages. Il y a même un exemple dans le fichier d'aide 'trace'. –

+0

Merci. J'ai déjà lu cette aide, mais je n'ai pas trouvé la solution. Je vais regarder à nouveau. – Marco