2015-02-14 20 views
10

Ho uno script R molto lungo con molte istruzioni if ​​e casi di eccezione. Come sto andando, se ho importato e testato le librerie come sono andato e non le ho documentate molto bene. Il problema è che se eseguo questo da un'installazione pulita, non sono sicuro di quali istruzioni verrà eseguito lo script, e quindi quali librerie saranno necessarie.Come sapere quali pacchetti sono stati utilizzati in R

La mia domanda è: c'è qualche funzione R per verificare quali librerie vengono utilizzate in uno script?

EDIT: non ho usato tutte le librerie che sono stati installati in modo print(sessionInfo()) non sarà utili ma e voglio solo per avviare lo script con una funzione di install.packages

+0

[Questo è quello che stai cercando] (http://stackoverflow.com/questions/9341635/how-can-i-check -for-installed-r-packages-before-running-install-packages) – Ethaan

+2

@Ethaan che non è proprio quello che sta chiedendo – nico

+0

Penso che tu stia cercando uno spading/strumento di sterilizzazione dell'autore (i) della sceneggiatura . Penso che tu sia condannato a eseguire lo script e installare i pacchetti mentre procedi, capendo quale funzione proviene da quale pacchetto. Buona fortuna con lo stesso nome funziona su diversi pacchetti (questo è dove lo strumento viene a portata di mano). Trovo 'library (" sos "); findFn (" foo ")' utile per cercare le funzioni. –

risposta

2

Non sono sicuro di una buon modo per automatizzare questo ... ma cosa si potrebbe fare è:

  1. Aprire una nuova console R
  2. Verificare con sessionInfo che non si dispone di pacchetti extra caricati.
    È possibile controllare questo utilizzando sessionInfo. Se, per impostazione predefinita, carichi pacchetti aggiuntivi (ad esempio utilizzando il tuo file .RProfile) ti suggerisco di evitare di farlo, in quanto è una ricetta per il disastro.
    Normalmente si dovrebbe avere solo i pacchetti di base caricati: stats, graphics, grDevices, utils, datasets, methods e base.

    potete scaricare eventuali librerie extra utilizzando:

    detach("package:<packageName>", unload=TRUE) 
    
  3. Ora eseguire lo script dopo aver commentato tutti i library e require chiamate e vedere quali funzioni danno un errore.

  4. Per ottenere quale pacchetto è richiesta da ogni tipo di funzione nella console:

    ??<functionName> 
    
  5. carico i pacchetti necessari e rieseguire i passaggi 3-5 fino soddisfatti.

+0

Sì, questo è più o meno quello che sto facendo al momento. Probabilmente finirò per avere alcune dichiarazioni all'inizio installando tutti i pacchetti che attualmente ho scaricato. - anche se non sono utili. – aeongrail

1

Si potrebbe desiderare di guardare la funzione di posto di blocco da Revolution Analytics su GitHub qui: https://github.com/RevolutionAnalytics/checkpoint

Fa parte di questo, e risolve il problema della riproducibilità. Ma non vedo che possa riportare un elenco di ciò che stai usando.

Tuttavia, se hai guardato il codice probabilmente avrai qualche idea.

1

ho usato in precedenza a shell script per questo:

#!/usr/bin/env bash 

source_files=($(git ls-files '*.R')) 
grep -hE '\b(require|library)\([\.a-zA-Z0-9]*\)' "${source_files[@]}" | \ 
    sed '/^[[:space:]]*#/d' | \ 
    sed -E 's/.*\(([\.a-zA-Z0-9]*)\).*/\1/' | \ 
    sort -uf \ 
    > DEPENDS 

Questo utilizza Git per raccogliere tutti i file R sotto il controllo di versione in un progetto. Dal dovresti comunque usare il controllo di versione questa è normalmente una buona soluzione (anche se potresti voler adattare il sistema di controllo della versione). Per i pochi casi in cui il progetto non è sotto controllo di versione dovresti (1) metterlo sotto controllo di versione. Oppure, in caso contrario, (2) utilizzare find . -regex '.*\.[rR]' anziché git ls-files '*.R'.

E produce uno DEPENDS file contenente un elenco molto semplice di dipendenze.

Trova solo chiamate dirette a library e require tuttavia, se le chiamate vengono completate, lo script non funzionerà.

+3

Non penso che l'OP lo stia chiedendo, ma forse potrei fraintendere la domanda. Quello che penso stia chiedendo è che ha caricato diverse librerie e non è sicuro di quale non sia necessario. – nico

+0

@nico Uh, hai perfettamente ragione. –

+1

Se si usa '[\ .a-ZA-Z0-9]' invece di '\ w' e' [[: alnum:]] 'si acquisiscono tutti i nomi dei pacchetti R validi. –

0

Avevo un bisogno simile quando avevo bisogno di convertire il mio codice in un pacchetto, quindi ho bisogno di identificare ogni dipendenza del pacchetto e importare o usare il nome completo completo.

Nel libro di lettura Extending R ho trovato XRtools::makeImports possibile eseguire la scansione di un pacchetto e trovare tutti i pacchetti devono essere importati. Questo non risolve ancora il nostro problema poiché si applica solo al pacchetto esistente, ma ha fornito le informazioni principali su come farlo.

Ho creato una funzione e l'ho inserita nel pacchetto mischelper. È possibile installare il pacchetto, utilizzare il menu aggiuntivo di RStudio per eseguire la scansione del file corrente o del codice selezionato o utilizzare le funzioni della riga di comando. Ogni funzione esterna (fun_inside) e la funzione che la chiama (utilizzo) saranno elencate nella tabella.

enter image description here

questo punto è possibile ad ogni funzione, premere F1 per trovare quale pacchetto appartiene. In realtà ho un altro pacchetto in grado di scansionare tutti i pacchetti installati per i nomi delle funzioni e creare un database, ma questo potrebbe causare più falsi positivi per questo utilizzo perché se carichi solo alcuni pacchetti, premendo F1 esegui solo ricerche sui pacchetti caricati.

Vedi dettagli l'utilizzo nella mia pagina pacchetto

https://github.com/dracodoc/mischelper

Problemi correlati