2012-04-13 3 views
0

ich eine Liste Ziel des folgenden Formats habe:Matrix zur Liste Inkompatibilität mit Plotfunktion

> str(TEST.Lmm) 
List of 16 
$ NofSimulations: num 2 
$ r    : num [1:511] 0.851 1.276 1.702 2.127 2.553 ... 
$ Ltheo   : num [1:511] 10.7 11.4 14.2 23.7 28.3 ... 
$ Lmm   : num [1:511] 27.6 27.6 29.6 58.2 74.5 ... 
$ Lmm.sims  : num [1:511, 1:2] 0 0 14.5 35.5 35.5 ... 
$ Lmm.maxdev : num [1:3] 266.5 45 25.4 
$ Lmm.intdev2 : num [1:3] 7563233 333376 53004 
$ Lmm.intdev1 : num [1:3] 46093 11597 4472 
$ lower   : num [1:511] 0 0 0 19.3 19.7 ... 
$ upper   : num [1:511] 0 0 14.5 35.5 35.5 ... 
$ k    : num 1 
$ pmaxdev  : num 0.333 
$ pintdev2  : num 0.333 
$ pintdev1  : num 0.333 
$ typeIerror : num 1 
$ call   : language mtests.Lmm(NofSimulations = 2, k = 1, data.mpp = Ahx[[7]], permutate = TRUE,  rmin = rmin, rmax = rmax) 
- attr(*, "class")= chr "mtests.Lmm" 

ich diese Ergebnisse ohne Probleme mit dem folgenden Plotbefehl plotten kann [mir die Funktionen eines zukünftigen R mit -Package, das bisher auf CRAN veröffentlicht wurde].

plot.mtests.Lmm(TEST.Lmm, Plot.zeroline=TRUE, main="", xlim=c(0,rmax), ylim=c(-500,500), xlab=expression(italic(r)), ylab=expression(italic(hat(L)[mm](r)-hat(L)(r))), las=1) #this works fine! 

Die Plot-Funktion ist ziemlich komplex, aber was ist wichtig zu wissen ist, dass es die Verwendung des meisten des Elements in der obigen Liste nennt (zB $ NofSimulations, $ r, etc)

I habe eine Reihe von Analysen und meine Ergebnisse sind eine Matrix aus folgendem Format läuft:

> Greenland.Lmm 
       [,1]   [,2]   [,3]   [,4]   [,5]   [,6]   
NofSimulations 2   2   2   2   2   2   
r    Numeric,511 Numeric,512 Numeric,512 Numeric,512 Numeric,512 Numeric,511 
Ltheo   Numeric,511 Numeric,512 Numeric,512 Numeric,512 Numeric,512 Numeric,511 
Lmm   Numeric,511 Numeric,512 Numeric,512 Numeric,512 Numeric,512 Numeric,511 
Lmm.sims  Numeric,1022 Numeric,1024 Numeric,1024 Numeric,1024 Numeric,1024 Numeric,1022 
Lmm.maxdev  Numeric,3 Numeric,3 Numeric,3 Numeric,3 Numeric,3 Numeric,3 
Lmm.intdev2 Numeric,3 Numeric,3 Numeric,3 Numeric,3 Numeric,3 Numeric,3 
Lmm.intdev1 Numeric,3 Numeric,3 Numeric,3 Numeric,3 Numeric,3 Numeric,3 
lower   Numeric,511 Numeric,512 Numeric,512 Numeric,512 Numeric,512 Numeric,511 
upper   Numeric,511 Numeric,512 Numeric,512 Numeric,512 Numeric,512 Numeric,511 
k    1   1   1   1   1   1   
pmaxdev  0.3333333 0.3333333 0.3333333 0.3333333 0.3333333 0.6666667 
pintdev2  0.3333333 0.3333333 0.3333333 0.3333333 0.3333333 1   
pintdev1  0.3333333 0.3333333 0.3333333 0.3333333 0.3333333 0.6666667 
typeIerror  1   1   1   1   1   1   
call   Expression Expression Expression Expression Expression Expression 

ich mag jeden von diesen getrennt plotten den Plot Befehl früher vorgestellt. Allerdings, wenn ich die folgenden tun, erhalte ich eine Fehlermeldung:

# step 1) transform matrix into list 
xnew<-lapply(seq_len(ncol(Greenland.Lmm[,1,drop=FALSE])), function(i) Greenland.Lmm[,1,drop=FALSE][,i]) 

> plot.mtests.Lmm(xnew, Plot.zeroline=TRUE, main="", xlim=c(0,max(Greenland.Lmm[,1]$r)), ylim=c(-500,500), xlab=expression(italic(r)), ylab=expression(italic(hat(L)[mm](r)-hat(L)(r))), las=1) 
Plot of r vs L[mm](r)-L(r). 
Error in 1:x$NofSimulations : argument of length 0 

Das Problem ist, dass ich nicht die Daten in meiner Liste zugreifen kann, wie durch die plot.mtests.Lmm Funktion aufgerufen.

> xnew$NofSimulations 
NULL 
#vs 
> xnew[[1]]$NofSimulations 
[1] 2 

So sind meine Optionen, um eher die plot.mtests.Lmm Funktion zu ändern (was ich würde es vorziehen, nicht) oder einen Weg, um ihn zu arbeiten finden ... aber wie? Wie kann ich die extra [1]] fahren? Außerdem würde ich gerne all das in einen netten kleinen Code (vielleicht eine for-Schleife?) Schreiben, so dass ich nicht jeden Schritt manuell replizieren muss. Ich würde mich über Ideen freuen, was der beste Ansatz wäre!

Antwort

0

Da ist eine Menge Code, also bin ich vielleicht weit von der Basis entfernt, aber es sieht so aus, als könnten Sie sapply(xnew, "[[", "NofSimulations") verwenden, um das NofSimulations-Element aus der Liste zu holen. Sobald es in einem Vektor ist, könnten Sie versuchen, zu plotten?

+0

ja, sorry für alle Codes! Ich habe versucht herauszufinden, wie ich mein Problem so klar wie möglich erklären könnte ... Es könnte komplizierter geworden sein zu verstehen! Ich muss auf alle Elemente der Liste zugreifen, nicht nur auf NofSimulations. Aber jetzt, wenn ich xnew $ elementofinterest anfordere, gibt es einen NULL (funktioniert nur mit xnew [[1]] $ elementofinterest.Müssen Sie die [[]] entfernen, damit ich die Plot-Funktion aufrufen kann, ohne etwas darin zu ändern, aber ich weiß nicht, wie ich diese [[]] entfernen soll? – GodinA

+0

Versuchen Sie 'sapply' anstelle von' lapply' zu verwenden, wenn Sie 'xnew' erstellen? –

+0

Danke @JeffAllen, aber das hilft nicht, immer noch das gleiche Problem. – GodinA

1

Das folgende sollte xnew$NofSimulations erhalten, um 2 in dem Beispiel zurückzugeben, wie Sie es gaben (also nur die erste Spalte von Greenland.Lmm betrachtend).

xnew<-unlist(lapply(seq_len(ncol(Greenland.Lmm[,1,drop=FALSE])), 
    function(i) Greenland.Lmm[,1,drop=FALSE][,i]), recursive = FALSE) 

Allerdings sieht das Beispiel so aus, als wäre es ziemlich gezähmt von dem, was Sie tun möchten. Wenn Sie die Daten auf Plotten in jeder Spalte von Greenland.Lmm sequentiell planen, würde ich vorschlagen, ähnlich wie die Schaffung Xneu, wie Sie taten in Ihrer ursprünglichen Frage

xnew<-lapply(seq_len(ncol(Greenland.Lmm)), function(i) Greenland.Lmm[,i]) 

und Sie folgendermaßen vorgehen:

plot.mtests.Lmm(xnew[[1]], Plot.zeroline=TRUE, main="", 
    xlim=c(0,max(xnew[[1]]$r)), ylim=c(-500,500), 
    xlab=expression(italic(r)), 
    ylab=expression(italic(hat(L)[mm](r)-hat(L)(r))), las=1) 

wo Sie Ersatz welche Spaltennummer Sie auch für den Listenindex von xnew möchten.

Wenn Sie die Daten in jeder Spalte in einer plotten möchten Schlag fiel:

lapply(seq_len(ncol(Greenland.Lmm)),function(x){ 
    xnew<-Greenland.Lmm[,x] 
    plot.mtests.Lmm(xnew, Plot.zeroline=TRUE, main="", 
    xlim=c(0,max(xnew$r)), 
    ylim=c(-500,500), xlab=expression(italic(r)), 
    ylab=expression(italic(hat(L)[mm](r)-hat(L)(r))), las=1) 
    } 
) 

Haben diese Vorschläge, die Sie bekommen, was Sie wollen?

Verwandte Themen