2013-09-21 8 views
8

Tytuł nie jest opisowy, ponieważ problem jest dłuższy niż uzasadniony tytuł, który mógłbym wyświetlić.Pobieranie nazw obiektów z poziomu funkcji

Chcę mieć funkcję, która pobiera nazwy obiektów z innych funkcji, które mogą być używane jako argumenty w innej funkcji. Oto Barebone próba:

grab <- function(x) { 
    as.character(substitute(x)) 
} 

FUN <- function(foo, bar = grab(foo)) { 
    bar 
} 

FUN(mtcars) 

tu za Kupię FUN powrócić ciąg znaków „mtcars” ale zwraca „foo”. W jaki sposób można utworzyć funkcję przechwytywania, która to robi (chcę to zrobić, ponieważ zamierzam użyć tego jako domyślnego dla pliku txt/csv itp. Jest to ustawienie wygody:

Oto niektóre nieudane próby (ale chcę mieć ogólną funkcję grab):

FUN2 <- function(foo, bar = as.character(substitute(bar))) { 
    bar 
} 

FUN2(mtcars) 

#================== 

FUN3 <- function(foo, bar) { 
    if(missing(bar)) bar <- foo 
    as.character(substitute(bar)) 
} 

FUN3(mtcars) 

Prawdziwe życie-owski przykład:

real_example <- function(obj, file = grab(obj)) { 
    write.csv(obj, file = sprintf("%s.csv", file)) 
} 
+0

Możesz edytować lub edytować tytuł, aby było to bardziej zrozumiałe. –

+0

To pytanie wygląda bardzo podobnie: http://stackoverflow.com/questions/5754367/using-substitute-to-get-argument-name- with – Frank

+0

@Frank czy otrzymałeś/-aś którąś z tych odpowiedzi do pracy? –

Odpowiedz

6

można spróbować sys.call aby uzyskać dostęp do połączenia nadrzędnego:

## "which" is the number of the argument of interest 
grab <- function(which) { 
    ## which + 1, because [1] == name of function/call 
    ## and arguments are 2:n 
    as.character(sys.call(-1L)[which+1L]) 
} 

FUN <- function(foo, bar = grab(1L)) { 
    bar 
} 

FUN(mtcars) 
# "mtcars" 
+0

To jest zachowanie, którego szukam. Sprawdzę jako odpowiedź na wypadek, gdyby inni mieli lepszą opcję (np. Ktoś wskazuje na coś wadliwego). –

+0

+1. Tak, jak mówi Tyler, jeśli nie ma nic złego w robieniu tego w ten sposób (zamiast podania nazwy "mtcars" i użycia 'get'), mógłbym również użyć tego. – Frank

6

Co powiesz na to?

grab <- function(x) as.character(x[["foo"]]) 
FUN <- function(foo, bar=grab(match.call())) { bar } 

FUN(mtcars) 
# [1] "mtcars" 
+0

To również działa. +1 –

Powiązane problemy