2010-11-05 16 views
14

Super szybkie pytanie ...Przesyła argument funkcji jako ciąg znaków?

W jaki sposób bierzesz określoną funkcję (zdefiniowaną przez użytkownika) i rzutujesz ją jako ciąg znaków?

Jeśli na prosty przykład

foo <- function(x) { ... } 

Chcę po prostu wrócić X za nazwę obiektu. Więc

foo(testing123) 

powraca "testing123" (i testing123 może być tylko jakiś przypadkowy wektor numeryczny)

Przepraszam jeśli to pytanie zostało zadane wcześniej - szukał, ale nie mógł go znaleźć! Dzięki!!

Odpowiedz

31
foo <- function(x) deparse(substitute(x)) 
2

Ups, najwyraźniej nie szukanie wystarczająco mocno ...

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

Dobrze, że łatwo ...

+0

'' deparse (substitute (x)) 'byłoby zwykłym sposobem robienia tego, zgodnie z odpowiedzią JD. Porównaj swoją wersję z JD na tym 'foo (testing * bar)', aby zobaczyć dlaczego. –

+0

Tak! Właśnie to sobie uświadomiłem. "deparse" jest drogą do zrobienia. Dzięki za potwierdzenie. – Ray

+3

jeśli jesteś zadowolony z odpowiedzi JD, upewnij się, że ją akceptujesz, więc i) JD dostaje trochę powtórzeń i ii) inni użytkownicy czytający Q wiedzą, że to odpowiedział twój Q –

17

Meta-odpowiedź: jeśli wiesz R robi coś i chcesz aby to zrobić, sprawdź źródło. Na przykład, mogłeś zauważyć, że plot(foo) trzyma "foo" w ylab, więc działka może to zrobić. W jaki sposób? Zacznij od spojrzenia na kod:

> plot 
function (x, y, ...) 
{ 
    if (is.function(x) && is.null(attr(x, "class"))) { 
     if (missing(y)) 
      y <- NULL 
     hasylab <- function(...) !all(is.na(pmatch(names(list(...)), 
      "ylab"))) 
     if (hasylab(...)) 
      plot.function(x, y, ...) 
     else plot.function(x, y, ylab = paste(deparse(substitute(x)), 
      "(x)"), ...) 
    } 
    else UseMethod("plot") 
} 

I jest pewna magia deparse(substitute(x)).

+0

Nie jestem pewien, czy to naprawdę ma znaczenie, ponieważ sama odpowiedź jest świetna, ale 'działka' nie wygląda już tak –

+0

@Spacedman: jest to bardzo dobry punkt! – theforestecologist

Powiązane problemy