54 votes

Quelles sont les façons de modifier une fonction dans R?

Disons que nous avons la fonction suivante:

foo <- function(x)
{
    line1 <- x
    line2 <- 0
    line3 <- line1 + line2
    return(line3)
}

Et que nous voulons modifier la deuxième ligne:

    line2 <- 2

Comment voudriez-vous faire cela?

Une façon est d'utiliser

fix(foo)

Et modifier la fonction.

Une autre façon est de simplement écrire à nouveau la fonction.

Est-il une autre voie? (Rappelez-vous, la tâche a été de changer seulement la deuxième ligne)

Ce que je voudrais, c'est une façon de représenter la fonction comme un vecteur de chaînes de caractères (bien, caractères), puis modifiez l'un de ses valeurs, et ensuite de le transformer en une fonction à nouveau.

44voto

BondedDust Points 105234
 > body(foo)[[3]] <- substitute(line2 <- 2)
> foo
function (x) 
{
    line1 <- x
    line2 <- 2
    line3 <- line1 + line2
    return(line3)
}
 

(Le "{" est body (foo) [[1]] et chaque ligne est un élément successif de la liste.)

28voto

mropa Points 2813

Ou de prendre un coup d'oeil à la fonction de débogage trace(). Il n'est probablement pas exactement ce que vous cherchez, mais il vous permet de jouer avec les changements et il a la fonctionnalité intéressante que vous pouvez toujours revenir en arrière à l'original de votre fonction avec untrace(). trace() fait partie de l' base forfait et est livré avec une belle et approfondie de la page d'aide.

Commencez par appeler as.list (body(foo)) voir toutes les lignes de votre code.

as.list(body(foo))
[[1]]
`{`

[[2]]
line1 <- x

[[3]]
line2 <- 0

[[4]]
line3 <- line1 + line2

[[5]]
return(line3)

Ensuite, il vous suffit de définir ce qu'il faut ajouter à votre fonction et où le placer, en définissant les arguments en trace().

trace (foo, quote(line2 <- 2), at=4)
foo (2)
[1] 4

Je l'ai dit au début, que l' trace() pourrait ne pas être exactement ce que vous cherchez, puisque vous n'avez pas vraiment changer votre troisième ligne de code et, au lieu de simplement réaffectés la valeur de l'objet line2 dans la suivante, insérée ligne de code. Il devient plus clair si vous imprimez le code de votre maintenant tracé de la fonction

body (foo)
{
    line1 <- x
    line2 <- 0
    {
        .doTrace(line2 <- 2, "step 4")
        line3 <- line1 + line2
    }
    return(line3)
}

23voto

Shane Points 40885

fix est la meilleure façon que je sache de le faire, bien que vous puissiez également utiliser edit et le réaffecter:

 foo <- edit(foo)
 

C'est ce que fix fait en interne. Vous pouvez le faire si vous souhaitez réaffecter vos modifications à un nom différent.

17voto

Richie Cotton Points 35365

fixInNamespace est comme fix , pour les fonctions d'un package (y compris celles qui n'ont pas été exportées).

9voto

doug Points 29567

Vous pouvez utiliser la fonction « corps ». Cette fonction renverra le corps de la fonction:

 fnx = function(a, b) { return(a^2 + 7*a + 9)}
body(fnx)
# returns the body of the function
 

Donc, un bon moyen de «modifier» une fonction consiste à utiliser «corps» sur le côté gauche d'une instruction d'affectation:

 body(fnx) = expression({a^2 + 11*a + 4})
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X