2011-06-19 20 views
26

Próbuję wywołać funkcję z podanym ciągiem nazwy funkcji.Jak wywołać funkcję, używając ciągu znaków nazwy funkcji w R?

E.g.

print(funcList) 
[[1]] 
`*` 

[[2]] 
sin 

utwory:

mult <- `*` 
mult(5,6) 
[1] 30 

nie działa:

func1 <- funcList[[1]] 
func1(5,6) 

func2 <- funcList[[2]] 
func2(1.2) 

Więc to jest możliwe, aby połączyć wszystkie funkcje w functionList?

+0

Twój przykład działa dla m e i elementy twojej listy nie są znakami, są funkcjami. –

Odpowiedz

31

Te nie wyglądają jak struny; to wygląda jak lista funkcji. Aby odpowiedzieć na pytanie zadane w tytule, zobacz: get(). Na przykład, przy użyciu listy ale przechowywane jako ciągi znaków:

funcList <- list("*", "sin") 

możemy użyć get() powrót funkcji z nazwą nadaną przez wybranego elementu listy:

> f <- get(funcList[[1]]) 
> f 
function (e1, e2) .Primitive("*") 
> f(3,4) 
[1] 12 

Alternatywą jest match.fun() funkcja, która dany ciąg znajdzie funkcję o pasującej nazwy tego łańcucha:

> f2 <- match.fun(funcList[[1]]) 
> f2(3,4) 
[1] 12 

ale jak ?match.fun mówi nam, prawdopodobnie nie powinniśmy tego robić po znaku zachęty, ale z poziomu funkcji.

Jeśli masz listę funkcji, to można po prostu indeks na liście i użyć go jako funkcję:

> funcList2 <- list(`*`, sin) 
> str(funcList2) 
List of 2 
$ :function (e1, e2) 
$ :function (x) 
> funcList2[[1]](3, 4) 
[1] 12 
> funcList2[[2]](1.2) 
[1] 0.9320391 

lub można zapisać funkcje jako obiektów tymczasowych, ale niewiele punkt w ten sposób:

> f3 <- funcList2[[1]] 
> f3(3,4) 
[1] 12 
> f4 <- funcList2[[2]] 
> f4(1.2) 
[1] 0.9320391 
+0

dzięki za odpowiedź. ale miałeś rację ... Nie mam listy ciągów mam listę funkcji. czy możesz mi powiedzieć, jak to zrobić z listą funkcji? – tObi

+0

@tobi jako @Joshua wymienione w powyższym komentarzu, co dla mnie działa. Zaktualizowałem swoją odpowiedź, aby pokazać, co działa. Jeśli przykład w mojej odpowiedzi nie działa dla ciebie, edytuj swoje pytanie, aby pokazać nam dokładny wynik, jaki daje R przy próbie tego. –

21

Zobacz dokumentację dla do.call.

Szybkie demonstracji:

do.call("rnorm", list(100, 0, 1)) 

pierwszy parametr może być ciągiem dosłowny lub R przedmiot, a drugi jest lista argumentów, które mają być dopasowane do funkcji pod warunkiem formalnych argumentów.

1

można też użyć match.fun

> functionlist <- list("*","sin") 
> f <- match.fun(functionlist[[1]]) 
> f(5,6) 
[1] 30 
Powiązane problemy