Domanda

Di 'Ho una lista di R in questo modo:

> 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

voglio elaborare ogni data.frame nella lista utilizzando l_ply, ma ho anche bisogno del nome (ad esempio aug9104AP) per essere passato nella funzione di elaborazione insieme al data.frame. Qualcosa di simile:

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
)

Quale dovrebbe essere arg_to_access_current_list_item_name?

È stato utile?

Soluzione

Nel caso in cui li passano uno ad uno, è possibile utilizzare Deparse (sostituto (arg)), ad esempio:

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

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

per l_ply, si dovrà ricorrere ad aggiungere l'attributo alla lista stessa per esempio:

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

Quindi è possibile utilizzare attr:

cli <- attr(x,"name")

Saluti

Altri suggerimenti

E 'più facile iniziare con i nomi, e poi usarli per estrarre la punta che ti interessa:

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

È inoltre possibile utilizzare m_ply a passare sia il nome e dei dati:

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

Joris risposta è il modo più pulito per fare questo. Vorrei aggiungere una funzione per estrarre l'attributo:

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

Quindi lo si utilizza come:

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

Io di solito utilizzare questo metodo:

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

iterare su nomi ed estratto data.frame dalla lista originale che li utilizzano.


Proprio per l'avviso v'è un hack. Non consiglio è causa è pasticciare con cornici ed è difficile da controllare.
Utilizzando fatto che llply è in realtà un ciclo for è possibile estrarre passo reale dall'interno di una funzione. Esso può essere fatto utilizzando get con l'ambiente corretto.

l_ply(data.list, function(df, ...) {
    cli.name<- names(data.list)[get("i",parent.frame())]
    # make plots, save results using cli.name
})
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top