2015-04-28 2 views
3

J'ai fonctions f1 et f2 qui prennent une fonction comme argument, par exemple:R: trouver le nom original d'une fonction passée comme argument

f1 <- function(FUN) { 
    ... 
} 


f2 <- function(FUN) { 
    f1(FUN=FUN) 
} 

De l'intérieur fonction f1, je dois retrouver l'original nom de la fonction transmise à f2, par exemple "myFunc", mais pas "FUN".

Fondamentalement pouvons-nous imaginer une fonction f1 de sorte que f2(f1(mean)) renvoie "mean"? Si FUN est anonyme, nous pouvons par exemple retourner NULL ou NA.

Existe-t-il un moyen facile/standard de le faire dans R? J'ai essayé de rechercher manuellement le code de fonction identique, en utilisant (mais il est pas très propre et je suis à la recherche d'une meilleure solution)

fn = unlist(as.list(lsf.str(envir=.GlobalEnv))) 
for (f in fn) { 
    if (setequal(paste(body(myFunc)),paste(body(f)))) { 
     return(f) 
    } 
} 
+1

Il n'y a pas assez d'informations ici. Vous devez créer un exemple reproductible. Si 'FUN' est censé être une fonction, il pourrait être anonyme. Que devrait-on retourner dans un tel cas? – Roland

+0

@Roland Fondamentalement pouvons-nous imaginer une fonction 'f1' de sorte que' f2 (f1 (mean)) 'renvoie" mean "? Si FUN est anonyme, on peut par exemple retourner NULL ou NA. J'ai modifié la question avec vos commentaires – RockScience

Répondre

0

Vous pouvez utiliser le package lazyeval aussi:

f1 <- function(FUN) { 
    lazyeval::expr_text(FUN) 
} 


f2 <- function(FUN) { 
    f1(FUN = FUN) 
} 

f2(f2(f2(mean))) 
[1] "f2(f2(mean))" 

cela a fonctionné pour moi:

f1 <- function(FUN) { 
    eval(quote(substitute(FUN)), envir = parent.frame()) 
} 


f2 <- function(FUN) { 
    f1(FUN=FUN) 
} 

f2(mean) 

Dans ce cas, f1 évalue le substitute(FUN) appel dans l'environnement f2.

Voir les résultats theese:

> f2(mean) 
mean 
> f2(function(x) {NULL}) 
function(x) { 
    NULL 
} 

Si vous voulez que la sortie soit la chaîne, vous devez utiliser deparse, alors f1 peut être défini:

f1 <- function(FUN) { 
    eval(quote(deparse(substitute(FUN))), envir = parent.frame()) 
} 
0

Dans la plupart des situations, à la suite donner la fonction le nom d'origine

find.original.name <- function(fun) { 
    objects <- ls(envir = environment(fun)) 
    for (i in objects) { 
     if (identical(fun, get(i, envir = environment(fun)))) { 
      return(i) 
     } 
    } 
} 

a <- ls 
find.original.name(a) 
# [1] ls 

a <- glm 
find.original.name(a) 
# [1] "glm" 

a <- function() print("test") 
find.original.name(a) 
# [1] "a" 

Mais si une copie de la fonction (pour être précis, ce n'est pas une copie) et la fonction d'origine sont dans le même environnement, cette fonction ne peut pas fonctionner correctement ...

test <- function() print("test") 
a <- test 
find.original.name(a) 
# [1] "a"