2010-08-23 3 views
12

sagen, dass ich eine R-Liste wie folgen aussehen:l_ply: Wie übergebe ich das Namensattribut der Liste in die Funktion?

> summary(data.list) 
           Length Class  Mode 
aug9104AP      18  data.frame list 
Aug17-10_acon_7pt_dil_series_01 18  data.frame list 
Aug17-10_Picro_7pt_dil_series_01 18  data.frame list 
Aug17-10_PTZ_7pt_dil_series_01 18  data.frame list 
Aug17-10_Verat_7pt_dil_series_01 18  data.frame list 

Ich mag jede data.frame in der Liste verarbeiten l_ply verwenden, aber ich muß auch den Namen (zB aug9104AP) entlang ging in die Verarbeitungsfunktion zu mit dem data.frame. Etwas wie:

l_ply(data.list,function(df,...) { 

    cli.name<- arg_to_access_current_list_item_name 

    #make plots with df, use cli.name in plot titles 
    #save results in a file called cli.name 

    }, arg_to_access_current_list_item_name 
) 

Was soll arg_to_access_current_list_item_name sein?

Antwort

3

Falls Sie ihnen eines nach der anderen übergeben, können Sie Deparse (Ersatz (ARG)), zB:

test <- function(x){ 
     y <- deparse(substitute(x)) 
     print(y) 
     print(x) 
} 

var <- c("one","two","three") 
test(var) 
[1] "var" 
[1] "one" "two" "three" 

für l_ply, werden Sie das Attribut auf die Liste selbst zurückgreifen müssen hinzufügen zB:

for(i in 1:length(data.list)){ 
    attr(data.list[[i]],"name") <- names(data.list)[i] 
} 

Dann können Sie verwenden attr:

cli <- attr(x,"name") 

Prost

3

Joris Antwort ist der sauberste Weg, dies zu tun. Ich würde eine Funktion hinzufügen Attribut extrahieren:

for(ename in names(data.list)) { 
    attr(data.list[[ename]], "ename") <- ename 
} 
ename <- function(x) attr(x, "ename") # states for element name 

So verwenden Sie es als:

l_ply(data.list, function(df, ...) { 
    cli.name<- ename(df) 
    # make plots, save results using cli.name 
}) 

ich in der Regel diese Methode verwenden:

l_ply(names(data.list), function(cli.name, df=data.list[[cli.name]], ...) { 
    # make plots, save results using cli.name 
}) 

Iterate über Namen und extrahieren data.frame von Original Liste mit ihnen.


Nur für die Ankündigung gibt es einen Hack. Ich empfehle es nicht, weil es mit Frames verwechselt und es ist schwer zu kontrollieren.
Mit der Tatsache, dass llply ist eigentlich eine for Schleife können Sie tatsächlichen Schritt aus dem Inneren einer Funktion extrahieren. Es kann mit get mit der richtigen Umgebung durchgeführt werden.

l_ply(data.list, function(df, ...) { 
    cli.name<- names(data.list)[get("i",parent.frame())] 
    # make plots, save results using cli.name 
}) 
11

Es ist am einfachsten mit den Namen zu starten, und dann nutzen sie das Bit Sie Interesse an extrahieren:

l_ply(names(data.list),function(name,...) { 
    df <- data.list[[name]] 
) 

Sie auch m_ply verwenden können, sowohl in der Namen und Daten zu übergeben:

m_ply(cbind(names(data.list), data.list), function(name, df, ...) { 
    ... 
} 
+0

Ich endete tatsächlich damit Ihren ersten Weg. Ich fange an zu denken, dass der schwierige Teil an R ist, dass es so viele Möglichkeiten gibt, Dinge zu tun. – dnagirl

+1

Vielleicht ist dies eine sinnvolle Funktion hinzuzufügen? Z. B. könnte die Funktion, die der Datei gegeben wird, optional ein zweites Argument verwenden, oder sie könnte implizit jedem Objekt, das übergeben wird, implizit ein Namensattribut hinzufügen (vielleicht würde diese letztere Idee jedoch einen Leistungseinbruch beinhalten). –

Verwandte Themen