Un programma esterno necessita di un file di input con alcuni parametri di controllo, e desidero generare quelli automaticamente usando R. Di solito, uso semplicemente paste("parameter1: ", param1, ...)
per creare la lunga stringa di testo e l'output per un file, ma lo script diventa rapidamente illeggibile. Questo problema è probabilmente adatto a Baffo,templating sicuro con brew/whisker
library(whisker)
template= 'Hello {{name}}
You have just won ${{value}}!
'
data <- list(name = "Chris", value= 124)
whisker.render(template, data)
mio problema qui, è che non c'è di sicurezza controllando che data
contiene tutte le variabili richieste, ad esempio,
whisker.render(template, data[-1])
ignorerà silenziosamente il fatto che ho dimenticato di specificare un nome. Il mio programma finale si bloccherà, tuttavia, se non riesco a produrre un file di configurazione completo.
Un altro sistema di template è fornito da brew
; ha il vantaggio di realmente valutare le cose, e potenzialmente questo può anche aiutare a rilevare le variabili mancanti,
library(brew)
template2 = 'Hello <%= name %>
You have just won $<%= value %>!
'
data <- list(name = "Chris", value= 124)
own_brew <- function(template, values){
attach(values, pos=2)
out = capture.output(brew(text = template))
detach(values, pos=2)
cat(out, sep='\n')
invisible(out)
}
own_brew(template2, data)
own_brew(template2, data[-1]) # error
Tuttavia, sono bloccato con due problemi:
attach() ... detach()
non è l'ideale, (dà avvertimenti ogni tanto), o almeno non so come usarlo correttamente. Ho provato a definire un ambiente perbrew()
, ma era troppo restrittivo e non conoscevo più le funzionibase
...anche se si verifica un errore, una stringa viene comunque restituita dalla funzione. Ho provato a racchiudere la chiamata in
try()
ma non ho esperienza nella gestione degli errori. Come posso dire di uscire dalla funzione non producendo output?
Edit: Ho aggiornato la soluzione brew
di utilizzare un nuovo ambiente, invece di attach()
, e interrompere l'esecuzione in caso di errore. (?capture.output
suggerisce che non era la funzione di diritto di utilizzare qui, dal momento che "Si è tentato di scrivere in uscita per quanto possibile, di presentare se c'è un errore nella valutazione delle espressioni" ...)
own_brew <- function(template, values, file=""){
env <- as.environment(values)
parent.env(env) <- .GlobalEnv
a <- textConnection("cout", "w")
out <- try(brew(text = template, envir=env, output=a))
if(inherits(out, "try-error")){
close(a)
stop()
}
cat(cout, file=file, sep="\n")
close(a)
invisible(cout)
}
Ci deve essere un modo più semplice con tryCatch
, ma non riesco a capire una cosa sola nella sua pagina di aiuto.
Accolgo con favore altri suggerimenti sul problema più generale.
Grazie, questa è una possibilità. Mi piace il fatto che la birra abbia la capacità di valutare il codice. – baptiste
Ho usato il baffo nel mio esempio, ma ovviamente questo potrebbe essere facilmente modificato per lavorare con i modelli di preparazione. –
facilmente ... se si conoscono le espressioni regolari :) – baptiste