2013-08-18 10 views
8

Per esempio, se ha eseguito il script.A:C'è un modo semplice per dire se uno script R ha fatto uso di qualsiasi funzione in un pacchetto caricato?

library(ggplot2) 
a <- 12 

e poi script.B

library(ggplot2) 
b <- runif(100) 
qplot(b) 

sarei in grado di dire che script.A non ha in realtà fanno uso di ggplot2, mentre script.B fatto.

+0

Hai bisogno di sapere da quale pacchetto provengono le funzioni? – Thomas

+0

Quello che mi piacerebbe davvero fare è eliminare i pacchetti che non vengono utilizzati. Mentre riutilizzo il codice di vecchi progetti, mi sembra di aggiungere sempre (ma mai take-away) i pacchetti, e mentre potrei fare manualmente una specie di bisect per trovare i pacchetti non utilizzati, sarebbe una seccatura. Idealmente, potrei ottenere solo un run-down post-esecuzione di ciò che è stato effettivamente chiamato. –

+1

Fai una di queste domande: http://stackoverflow.com/questions/8761857/identifying-dependencies-of-r-functions-and-scripts e http://stackoverflow.com/questions/17402735/between-function-possible -improvement – Thomas

risposta

0

Prova questo:

1) Prima emissione di una chiamata library() per ogni pacchetto che si fa NON vogliono verificare. In questo caso c'è solo un pacchetto che è quello che vogliamo testare per poter saltare questo passaggio.

2) Eseguire lo script con library dummied out:

library <- list 
source("script.A") 
rm(library) # restore 

Se si ottiene nessun errore, allora lo script non dipende sulla confezione.

+1

Inserisco 'base :: library()' nel mio script :-) –

+1

E riguardo le importazioni di namespace? Potresti non ricevere un errore perché qualcosa è stato importato in un altro pacchetto caricato. Probabilmente raro, ma sembra possibile. – Thomas

5

Caricare normalmente la libreria e tracciare tutte le funzioni nell'ambiente del pacchetto (e nello spazio dei nomi). Userò una piccola funzione di supporto per fare questo:

trap_funs <- function(env) 
{ 
    f <- sapply(as.list(env, all.names=TRUE), is.function) 
    for(n in names(f)[f]) trace(n, bquote(stop(paste("Script called function", .(n)))), where=env) 
} 

Esempio:

library(data.table) 
trap_funs(as.environment("package:data.table")) 
trap_funs(asNamespace("data.table")) 

è necessaria Questa seconda affermazione al fine di garantire che le chiamate come data.table::xxx() anche ottenere intrappolati.

Esempio:

> as.data.table(mtcars) 
Tracing as.data.table(mtcars) on entry 
Error in eval(expr, envir, enclos) : Script called function as.data.table 

Si noti che il codice è stato interrotto.

Problemi correlati