2015-05-08 13 views
5

Czy istnieje sposób na uzyskanie nazwy i argumentów funkcji w sobie. Na przykład:W jaki sposób funkcja może zwrócić swoją nazwę i argumenty w R

> MYFN = function(name='test', num = 5, abool=T){ 
+ return ("MYFN = function(name='test', num = 5, abool=T)") 
+ } 
> 
> MYFN() 
[1] "MYFN = function(name='test', num = 5, abool=T)" 

chcę mieć fn nazwie getMyHeader(), która powinna zwracać nazwę i argumenty funkcji, z których jest o nazwie:

> MYFN = function(name='test', num = 5, abool=T){ 
+ getMyHeader() 
+ } 
> 
> MYFN() 
[1] "MYFN = function(name='test', num = 5, abool=T)" 

Albo po może być również pomocne :

getMyHeader(MYFN) 
[1] "MYFN = function(name='test', num = 5, abool=T)" 
+0

myślę, że można poskładać pożądany rezultat z kombinacji 'sys.call()' i 'sys .function() ', ale jestem pewien, że jest na to czystszy sposób. – nrussell

+0

'match.call' wydaje się być zbliżone do tego, co chcesz, ale nie całkiem istnieje. Aby uzyskać go w żądanej formie, trzeba będzie trochę manipulować. – Dason

+1

Chciałbym również zasugerować 'match.call', a dokładniej' deparse (match.call()) ', ale nie daje ci domyślnych argumentów. – Roland

Odpowiedz

4

kluczem jest wykorzystanie args uzyskać argumenty (łatwiejsze, ponieważ my nazywamy go z zewnątrz funkcji jesteśmy zainteresowani) i rezerwowego (x), aby pociągnąć w imię argumentu (tjnazwa funkcji). Jest to łatwiejsze, jeśli robisz to poza samą funkcją.

Możesz utworzyć funkcję lub metodę, aby uzyskać tę funkcję, jeśli przekażesz jej nazwę funkcji.

Oto przykład tworząc ogólną zwaną „głową” i w sposób, który jest używany kiedy główka została podana funkcja (zapobiega przypadkowemu wykonania na nie-funkcje)

header<-function(x){ 
UseMethod('header',x) 
} 

header.function <-function(x){ 
    y<-list(args(x)) 
    x<-as.character(substitute(x)) 
    print(sprintf('%s=%s',x,y)) 
} 

do badania:

myfn<- function(name='name',num=6,abol='abol'){ 
    return(name,num,abol) 
    } 
header(myfn) 

powraca:

[1] "myfn=function (name = \"name\", num = 6, abol = \"abol\") \nNULL" 

zanotować uciekły cytaty (jest to dobre dla PRI nting). Z góry zapominam, jak to rozebrać, ale nie powinno to być zbyt trudne.

Można to wykorzystać w dowolnej funkcji:

header(glm) 

Powroty:

[1] "glm=function (formula, family = gaussian, data, weights, subset, na.action, start = NULL, etastart, mustart, offset, control = list(...), model = TRUE, method = \"glm.fit\", x = FALSE, y = TRUE, contrasts = NULL, ...) \nNULL" 
+0

Dokładnie tego chciałem. Dzięki. – rnso

Powiązane problemy