2012-08-24 5 views
5

Z góry dziękuję i przepraszam, jeśli to pytanie zostało wcześniej odpowiedział - wyglądałem dość szeroko. Mam zestaw danych zawierający wiersz z połączonymi informacjami, w szczególności: nazwa, kod koloru, niektóre wyrażenie funkcji. Na przykład jedną wartością może być:Utwórz listę funkcji z wektora znaków

koszt # FF0033 @ log (x) +6.

Mam cały kod do wyodrębnienia informacji, a ja otrzymuję wektor wyrażeń, które chciałbym przekonwertować na listę rzeczywistych funkcji.

Na przykład:

func.list <- list() 
test.func <- c("x","x+1","x+2","x+3","x+4") 

gdzie test.func jest wektorem wyrażeń. Chciałbym to:

func.list[[3]] 

za równoważne

function(x){x+3} 

wiem, że mogę utworzyć funkcję przy użyciu:

somefunc <- function(x){eval(parse(text="x+1"))} 

do konwersji wartości znaków do funkcji. Problem pojawia się, gdy próbuję wykonać pętlę, aby utworzyć wiele funkcji. Na przykład coś próbowałem że nie działa:

for(i in 1:length(test.func)){ 
    temp <- test.func[i] 
    f <- assign(function(x){eval(expr=parse(text=temp))}) 
    func.list[[i]] <- f 
} 

oparciu o inne stanowisko (http://stats.stackexchange.com/questions/3836/how-to-create-a-vector-of działanie funkcji) próbowałem też tak:

makefunc <- function(y){y;function(x){y}} 
for(i in 1:length(test.func)){ 
    func.list[[i]] <- assign(x=paste("f",i,sep=""),value=makefunc(eval(parse(text=test.func[i])))) 
} 

co daje następujący błąd: błąd w eval (wyrażenie, Środ, enclos): obiekt „x” nie znaleziono

Ostatecznym celem jest podjęcie listy funkcji i zastosowanie funkcji jth do j-tej kolumny elementu data.frame, aby użytkownik skryptu mógł określić sposób normalizowania każdego col umn wewnątrz połączonych informacji podanych przez nagłówek kolumny.

Odpowiedz

3

Może zainicjować swoją listę z jedną funkcję rodzajowy, a następnie zaktualizować je za pomocą:

foo <- function(x){x+3} 
> body(foo) <- quote(x+4) 
> foo 
function (x) 
x + 4 

Dokładniej, począwszy od postaci, którą prawdopodobnie zrobić coś takiego:

body(foo) <- parse(text = "x+5") 
+0

Dzięki !! Działało idealnie. Dodam kod, którego użyłem do wykonania zadania, jako dodatkową odpowiedź dla innych użytkowników, gdy tylko SO pozwoli mi to zrobić. (i przepraszam za wszystkie komentarze/edycje/usunięcia/i cokolwiek - jestem oczywiście nowy w SO) – dayne

+0

@dayne Powiedziałbym, że dostałeś rękę rzeczy w porządku, w porównaniu do przeciętnego zupełnie nowego gościa SO. – joran

2

Aby dodać odpowiedź do jorana, to właśnie zadziałało:

test.data <- matrix(data=rep(1,25),5,5) 
test.data <- data.frame(test.data) 

test.func <- c("x","x+1","x+2","x+3","x+4") 
func.list <- list() 

for(i in 1:length(test.func)){ 
    func.list[[i]] <- function(x){} 
    body(func.list[[i]]) <- parse(text=test.func[i]) 
} 

processed <- mapply(do.call,func.list,lapply(test.data,list)) 

Dzięki aga w, joran.

1

To co mam zrobić:

f <- list(identity="x",plus1 = "x+1", square= "x^2") 
funCreator <- function(snippet){ 
    txt <- snippet 
    function(x){ 
    exprs <- parse(text = txt) 
    eval(exprs) 
    } 
} 
listOfFunctions <- lapply(setNames(f,names(f)),function(x){funCreator(x)}) # I like to have some control of the names of the functions 
listOfFunctions[[1]] # try to see what the actual function looks like? 
library(pryr) 
unenclose(listOfFunctions[[3]]) # good way to see the actual function http://adv-r.had.co.nz/Functional-programming.html 
# Call your funcions 
listOfFunctions[[2]](3) # 3+1 = 4 
do.call(listOfFunctions[[3]],list(3)) # 3^2 = 9 
attach(listOfFunctions) # you can also attach your list of functions and call them by name 
square(3) # 3^2 = 9 
identity(7) # 7 ## masked object identity, better detach it now! 
detach(listOfFunctions)