2013-08-12 14 views
5

I hacked razem funkcję Emacs aby wysłaćAutomatycznie zawsze funkcje czasowe w R

tOne <- proc.time()[3] 

przed kluczem mojego "send-to-R", a następnie

tTwo <- proc.time()[3] 

później, następnie drukarskiej różnica. Druk staje się jednak dość brudny.

Czy istnieje lepszy sposób w R, aby automatycznie czas wysłania wszystkiego do R? (Takie jak w F # #time "on")


EDIT: Obecnie wysyła jakieś dodatkowe znaki nowej linii, ponieważ bufor gorszy potrzebuje struny do wysłania:

> > a<-ocorrelate.parallel(replicate(2, rnorm(100000)), 0.5) 


> 
+ user 0.072 sys 0.020 elapsed 14.925 
> > a<-ocorrelate.parallel(replicate(2, rnorm(100000)), 0.5) 


> 
+ user 0.088 sys 0.032 elapsed 16.868 
> > 

Funkcja:

(defun ess-timed-cc (vis) 
    (interactive "P") 
    (process-send-string "R" "tone <- proc.time()[1:3];") 
    (ess-eval-region-or-function-or-paragraph-and-step vis) 
    (process-send-string "R" "ttwo <- proc.time()[1:3]; cat(paste(c(\"\", 
     format(ttwo-tone)), c(\"user\", \"sys\", \"elapsed\", \"\n\")));") 
    (other-window 1) 
    (inferior-ess-send-input) 
    (inferior-ess-send-input) 
    (goto-char (point-max)) 
    (other-window -1) 
) 
+0

co jest nieporządne w druku? – eddi

+0

@eddi Zaktualizowano odpowiedź. – PascalVKooten

+0

Rozumiem, czy możesz również dodać funkcję (funkcje) emacsa, której używasz do uzyskania tego wyniku? – eddi

Odpowiedz

1

Możesz włączyć profilowanie w R, a to wskaże ci względny czas spędzony w każdej funkcji, który może być tym, czego potrzebujesz. Szczegóły: ?Rprof.

Można również użyć numeru addTaskCallback, aby dodać wywołanie zwrotne, aby pokazać czas od zakończenia ostatniego wyrażenia, ale tym razem będzie to dowolny czas bezczynności i czas wpisania wyrażenia, a nie tylko czas wykonywania. Jeśli masz już wszystkie polecenia w pliku i po prostu wysyłasz je do wiersza poleceń, powinno to działać całkiem dobrze.

Może istnieć kilka haczyków, które można ustawić, które uruchamiałyby i zatrzymywały synchronizację, ale nie wszystkie funkcje mają haki.

Dla rozwiązania emacs można użyć tego do zawinięcia wywołania w system.time zamiast wywoływania proc.time dwa razy i odejmowania.

Można również użyć funkcji trace, aby wstawić 2 wywołania do proc.time na początku i końcu każdej funkcji, którą chciałeś wykonać. Wymagałoby to wektora nazw funkcji, które chciałyby mieć czas, ale może pomóc w tym ls.

+0

Jestem świadomy Rprof, ale w mój punkt widzenia, który był bardziej dla znalezienia wąskich gardeł. Sposób, w jaki wyobrażam sobie, że jest bardziej zwyczajnym, łatwo widocznym drukiem. – PascalVKooten

+0

+1 addTaskCallback to dobra sugestia. – PascalVKooten

+0

@Dualinity, dodałem kilka innych pomysłów, które mogą być możliwościami. –

Powiązane problemy