7
votes

Modèle d'erreur sécurisée avec Brew / Whisker

Un programme externe a besoin d'un fichier d'entrée avec certains paramètres de contrôle et je souhaite générer des personnes automatiquement à l'aide de R. Habituellement, j'utilise simplement Coller ("paramètre1:", param1, ...) code> Pour créer la longue chaîne de texte et sortir dans un fichier, mais le script devient rapidement illisible. Ce problème est probablement bien adapté à WHISKER,

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)
}


0 commentaires

4 Réponses :


4
votes

Utilisation d'expressions régulières pour récupérer les noms de variable du modèle, vous pouvez valider avant de rendu, par exemple, xxx


4 commentaires

Merci, c'est une option. J'aime le fait que Brew a la capacité d'évaluer le code.


J'ai utilisé la moustache dans mon exemple, mais bien sûr, cela pourrait être facilement modifié pour travailler à la place avec des modèles de bronze.


Facilement ... si on sait des expressions régulières :)


Notez que cette solution ne fonctionnera pas s'il y a des listes dans les données, par ex. Ce type de syntaxe {{#repo}} {{nom}} {{/ repo}} de moustache.github.io/mustache.5.html



3
votes

La nouvelle colle code> paquet fournit une autre alternative,

library(glue)
template <- 'Hello {name} You have just won ${value}!'
data <- list( name = "Chris", value= 124)

glue_data(template, .x=data)
# Hello Chris You have just won $124!

glue_data(template, .x=data[-1])
# Error in eval(expr, envir, enclos) : object 'name' not found


0 commentaires

1
votes

Depuis la version 1.1.0 (sur Cran 19 août 2016), le Stringr code> package inclut la fonction str_interp () code> (malheureusement non mentionnée dans le fichier de nouvelles de la version).

Error in FUN(X[[i]], ...) : object 'name' not found


0 commentaires

1
votes

Tout en préparant le StringR code> Réponse J'ai remarqué que les questions de OP concernant l'utilisation du Brew () Code> n'a pas été abordé jusqu'à présent. En particulier, l'OP vous demandait comment fournir ses données code> à l'environnement et comment empêcher une chaîne de caractères étant renvoyée en cas d'erreur.

L'OP a créé une fonction propre_brew () code> qui enveloppe l'appel à brew () code>. Bien que, il existe un paquet alternatif disponible maintenant, je pense que la question originale mérite une réponse. P>

C'est ma tentative d'améliorer La version de Baptiste : p> xxx pré>

Les principales différences sont que list2env () code> est utilisé pour transmettre la liste des valeurs à brew () code> et que l'appel à Essayez () code> est évité en testant la valeur de retour out code> pour une erreur. p> xxx pré>

Error in cat(name) : object 'name' not found
Error in own_brew(template, data[-1L]) :


0 commentaires