2012-08-24 3 views
5

Vielen Dank im Voraus, und Entschuldigung, wenn diese Frage zuvor beantwortet wurde - ich habe ziemlich ausgiebig gesucht. Ich habe ein Dataset, das eine Zeile mit verketteten Informationen enthält, insbesondere: Name, Farbcode, einige Funktionsausdrücke. Zum Beispiel kann ein Wert sein:Erstellen Sie eine Liste von Funktionen aus einem Vektor von Zeichen

Kosten # FF0033 @ log (x) +6.

Ich habe alle den Code, um die Informationen zu extrahieren, und ich am Ende mit einem Vektor von Ausdrücken, die ich in eine Liste von tatsächlichen Funktionen konvertieren möchte.

Zum Beispiel:

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

wo test.func der Vektor von Ausdrücken ist. Was ich möchte, ist:

func.list[[3]] 

Um zu

function(x){x+3} 

gleichwertig zu sein Ich weiß, dass ich mit einer Funktion erstellen:

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

einen Zeichenwert in eine Funktion zu konvertieren. Das Problem tritt auf, wenn ich versuche, mehrere Funktionen auszuführen. Ein Beispiel für etwas, das ich versuchte, das hat nicht funktioniert:

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

Basierend auf einem anderen Beitrag (http://stats.stackexchange.com/questions/3836/how-to-create-a-vector-of -Funktionen) ich habe auch versucht, dies:

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])))) 
} 

Welche der folgenden Fehler gibt: Fehler in eval (ausdr, envir, enclos): Objekt 'x' nicht

gefunden

Das Fernziel ist es, die Liste zu nehmen von Funktionen und wenden Sie die jth-Funktion auf die j-te Spalte von data.frame an, so dass der Benutzer des Skripts angeben kann, wie jeder col normalisiert werden soll innerhalb der verketteten Information, die durch den Spaltenkopf gegeben wird.

Antwort

3

Vielleicht Ihre Liste mit einer einzigen generischen Funktion initialisieren, und dann aktualisieren, um sie mit:

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

Insbesondere von einem Zeichen beginnt, dann würden Sie wahrscheinlich so etwas wie:

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

Dank !! Es hat perfekt funktioniert. Ich werde den Code, den ich verwendet habe, um die Aufgabe zu vervollständigen, als zusätzliche Antwort für andere Benutzer hinzufügen, sobald SO es mir erlaubt. (und Entschuldigung für alle Kommentare/Bearbeitungen/Löschungen/und was nicht - ich bin offensichtlich neu in SO) – dayne

+0

@dayne Ich würde sagen, Sie haben die Hand der Dinge ganz gut, im Vergleich zu den durchschnittlichen brandneuen SO-Besucher. – joran

2

nur hinzufügen, auf die Antwort von joran, ist es das, was schließlich arbeitete:

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)) 

Dank aga in, Johanna. Diese

1

ist, was ich tue:

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) 
Verwandte Themen