2016-03-30 6 views
4

Ich habe Funktion, die ich mit Fähigkeit erweitern kann, Ergebnisse in csv Akte zu speichern. Der Name der CSV-Datei werden sollten, um diese Funktion übergeben auf data.frame Namen generiert basierend:Wie man Name von data.frame von der Liste erhielt, funktionierte mit lapply

my.func1 <- function(dframe, ...){ 
    # PART OF CODE RESPONSIBLE FOR COMPUTATION 
    # ... 

    # PART OF CODE WHERE I WANT TO STORE RESULTS AS CSV 
    csv <- deparse(substitute(dframe)) 
    csv 
} 

Wenn ich diese Funktion aufrufen folgt dann der Name des Datensatzes an diese Funktion übergeben korrekt interpretiert wird:

> my.func1(mtcars) 
[1] "mtcars" 

Aber ich muss diese Funktion für jeden data.frame aus der Liste aufrufen. Wenn ich diese Funktion für bestimmte data.frame aus der Liste rufe dann ist es im Grunde arbeiten (ich den hässliche Name enthält auch die Liste nennen, aber eine Abhilfe trimmen könnte es regulären Ausdruck):

> LoDFs <- list(first=data.frame(y1=c(1,2,3), y2=c(4,5,6)), second=data.frame(yA=c(1,2,3), yB=c(4,5,6))) 
> my.func1(LoDFs$first) 
[1] "LoDFs$first" 

Problem ist, wenn Ich möchte diese Funktion für alle data.frames aus der Liste aufrufen. In diesem Fall werden die Namen von data.frame sind Chaos:

> lapply(LoDFs, my.func1) 
$first 
[1] "X[[i]]" 

$second 
[1] "X[[i]]" 

> lapply(seq_along(LoDFs), function(x) { my.func1(LoDFs[[x]]) }) 
[[1]] 
[1] "LoDFs[[x]]" 

[[2]] 
[1] "LoDFs[[x]]" 

Was mache ich falsch und wie kann ich erwähnt Abhilfe mit regulären Ausdrücken zu vermeiden und den Code robuster machen?

+1

ich das letzte Mal mit einem ähnlichen Problem konfrontiert wurde, gab ich auf und einen Vektor der Namen gemacht der data.frames, und dann verwendet get() um den data.frame zu greifen. Für Sie etwas wie lapply (Namen (LoDFs), my.func1), wo die erste Zeile von my.funct1 ist df <- Lodf [[n]] Ich hoffe, jemand hat eine elegantere Lösung. –

Antwort

3

f jeder Datenrahmen in der Liste

lapply (names (LoDf),function(i)write.csv (my.fun1 (LoDf [[i]]),paste0 (i,'.csv'))) 

Am Telefon kleine Fehler so vergeben

2

gestattet Das Problem, dass lapply ist Futtermittel nicht den Namen des Elements in der Liste, füttern sie nur der Gegenstand selbst.

Eine alternative Lösung ist mapply zu verwenden, die IMO präziser über die Eingabe anstatt sich auf Scoping

mapply(function(L,N){write.csv(L, paste0(N,".csv"));}, L=LoDFs,N=names(LoDFs)) 
+0

Das ist ein guter Punkt –

+0

Für diese Angelegenheit könnten wir auch sapply verwenden ... –

+0

@CarlBoneri darf ich fragen, wie 'Mapply' durch' sapply' ersetzt werden kann? –

Verwandte Themen