2013-02-19 30 views
6

Sto scrivendo una funzione che utilizza pandoc in R attraverso la riga di comando. Come posso usare R per verificare se pandoc è installato (suppongo anche che dovrebbe essere sul percorso che potrebbe essere un problema per gli utenti di Windows)?controllare se è installato un programma

+1

Testare entrambe le soluzioni su computer Windows che avevano pandoc e non avevano pandoc ... sembra che funzionino entrambi. Non so però quale sia la soluzione più robusta. – Dason

+3

Un vantaggio che posso vedere dell'approccio 'system ('pandoc-v')' su 'Sys.which' è che verifica che il programma non sia solo installato, ma possa essere effettivamente eseguito. –

+0

@BrianDiggs geniale !! – agstudy

risposta

3

Questo suggerimento si basa interamente sulla mia esperienza personale con questa domanda che RStudio non sembra leggere nel mio file di Ubuntu sul mio file .bashrc. Ho installato Pandoc utilizzando il metodo cabal install pandoc descritto con here poiché c'erano le funzionalità necessarie per le versioni più recenti di Pandoc di quelle disponibili con il gestore di pacchetti di Ubuntu. L'esecuzione di R dal terminale potrebbe rilevare Pandoc come previsto utilizzando Sys.which, ma quando si utilizza RStudio, non è stato possibile. Non ho idea se questo è un problema con gli utenti di Windows o no però!

Un'alternativa/soluzione in questo caso è in realtà la creazione di un vettore di percorsi tipici in cui si prevede l'eseguibile Pandoc da trovare (sotto la presunzione che molti utenti in realtà non Futz giro con dove installano programmi) . Queste informazioni sono, di nuovo, disponibili nella pagina di installazione collegata sopra, più il tipico percorso C:\\PROGRA~1\\... per Windows. Così, si potrebbe avere qualcosa di simile a quanto segue come i percorsi Pandoc:

myPaths <- c("pandoc", 
      "~/.cabal/bin/pandoc", 
      "~/Library/Haskell/bin/pandoc", 
      "C:\\PROGRA~1\\Pandoc\\bin\\pandoc") 
      # Maybe a .exe is required for that last one? 
      # Don't think so, but not a regular Windows user 

che può essere utilizzato con Sys.which() (ad esempio, Sys.which(myPaths)) e alcune delle altre idee già condivise.

  • Se la prima opzione è abbinata in modo univoco, non c'è alcun problema: è possibile utilizzare direttamente le chiamate di sistema a Pandoc.
  • Se una delle altre opzioni è abbinata in modo univoco, è possibile scrivere le proprie funzioni in modo tale da incollare il percorso completo dell'eseguibile nella chiamata di sistema anziché solo "pandoc".
  • Se la prima opzione e una qualsiasi delle altre opzioni sono abbinate, è sufficiente selezionare la prima opzione e procedere.
  • Se nessuno corrisponde, richiedere all'utente il percorso per l'installazione di Pandoc o fornire un messaggio su come installare Pandoc.
+0

questo approccio funziona e non richiede all'utente di riconfigurare le cose. Ho lavorato sia su Linux che su Windows +1 Non mi hai dato quello che ti ho chiesto per capire di cosa avevo bisogno. –

+0

+1! per condividere la tua esperienza! – agstudy

+0

@agstudy, prego. Sia le tue risposte che quelle di Dason sono state in realtà le prime a venire in mente (avevo fatto gli stessi suggerimenti a una domanda simile [qui] (http://stackoverflow.com/a/14376517/1270695) ma quando l'ho provato prima postando la mia risposta, non ha funzionato, quindi il mio bisogno di scavare un po 'di più;) – A5C1D2H2I1M1N2O1R2T1

3

Suppongo che sia possibile utilizzare Sys.which e verificare se il risultato è una stringa vuota.

pandoc.location <- Sys.which("pandoc") 
if(pandoc.location == ""){ 
    print("pandoc not available") 
}else{ 
    print("pandoc available") 
} 
+0

Funziona sulla mia finestra di Windows ma 'Sys.which (" firefox ")' restituisce '" "', ma 'system (" open firefox ")' avvia un browser Firefox ... Mi chiedo perché. –

+0

Sarebbe stato anche il mio suggerimento (l'ho suggerito anche a Tyler per Ghostscript [qui] (http://stackoverflow.com/a/14376517/1270695), ma per qualche motivo non funziona sul mio sistema. Forse perché era un'installazione di cabala? Ma non sono sicuro ... – A5C1D2H2I1M1N2O1R2T1

+0

Buon punto.Non ho davvero provato questo su Windows. Mi chiedo se pandoc potrebbe essere un po 'diverso, dal momento che è principalmente una utility da riga di comando – Dason

8

Non ho Pandoc da installare, ma in generale ho test se un programma è installato in questo modo:

pandoc.installed <- system('pandoc -v')==0 

Ad esempio, per verificare se Java è installato:

java.installed <- system('java -version') ==0 

java version "1.7.0_10" 
Java(TM) SE Runtime Environment (build 1.7.0_10-b18) 
Java HotSpot(TM) 64-Bit Server VM (build 23.6-b04, mixed mode) 
> java.installed 
[1] TRUE 
+1

la soluzione era esattamente quello che ho chiesto grazie. Ananda ha capito cosa avevo veramente bisogno quando non sapevo di averne bisogno. –

Problemi correlati