2010-06-04 7 views
7

J'ai quelques fichiers .Rdata qui contiennent des fonctions enregistrées comme défini par approxfun().Modifier le corps du texte des objets de fonction existants

Certains des fichiers de sauvegarde antérieurs à la modification approxfun du paquet « base » pour « stats », et donc le corps a

PACKAGE = "base" 

et le mauvais paquet provoque la fonction à l'échec. Je peux corriger (myfun) et simplement remplacer "base" par "stats", mais je veux un moyen automatique. Est-ce que je peux le faire avec gsub() et body() d'une façon ou d'une autre?

je peux obtenir le corps du texte et remplacer là avec

as.character(body(myfun)) 

mais je ne sais pas comment transformer ce retour dans un « appel » et remplacer la définition.

(je sais qu'une meilleure solution est d'avoir enregistré les données utilisées à l'origine par approxfun et recréer simplement la fonction, mais je me demande s'il y a un moyen judicieux de modifier l'existant.)

Edit: J'ai trouvé ici

What ways are there to edit a function in R?

+0

double possible de [? Quels sont les moyens pour modifier une fonction R] (http://stackoverflow.com/questions/2458013/what-ways-are-there-to-edit-a-function-in-r) –

+0

J'ai essayé 'body (foo) <- gsub (" PACKAGE = 'base' "," PACKAGE = 'stats' " , body (foo)) 'pour vous, mais body() ne renvoie pas de texte, donc vous ne pouvez pas utiliser la manipulation de texte pour le changer. J'ai vérifié cela avec @MrFlick –

+2

pourriez-vous alors écrire votre propre réponse afin que ce poste ne soit plus "sans réponse"? –

Répondre

3

Utilisez la fonction substitute.

Par exemple:

myfun <- function(x,y) { 
    result <- list(x+y,x*y) 
    return(result) 
} 

En utilisant body, traiter myfun comme une liste pour sélectionner ce que vous voulez changer dans la fonction:

> body(myfun)[[2]][[3]][[2]] 
x + y 

Lorsque vous modifiez, vous devez utiliser la substitute fonction afin que vous remplaciez la partie de la fonction par un objet call ou name, selon le cas. Le remplacement par des chaînes de caractères ne fonctionne pas puisque les fonctions ne sont pas stockées ou exploitées comme des chaînes de caractères.

body(myfun)[[2]][[3]][[2]] <- substitute(2*x) 

maintenant la pièce sélectionnée de la fonction a été remplacée:

> myfun 
function (x, y) 
{ 
    result <- list(2 * x, x * y) 
    return(result) 
} 
Questions connexes