2016-07-26 26 views
0

ich eine Liste mit Namen und eine Liste der Tabelle haben, die in ReporteRs Pakete zu erstellen, „MyFTable“ genannt, habe ich versucht Liste der MyFTable mit Liste tlapply der Liste in Reporters Pakete

t1 <- c("a","b","c") 
t2 <- c("d","e","f") 
t <- list(t1, t2) 

Wenn ich anwenden tun Sie es getrennt, es funktioniert, aber wenn ich die Schleife einsetze, funktioniert es nicht.

addHeaderRow(MyFTable[[1]], value=c("", t1)) 
    addHeaderRow(MyFTable[[2]], value=c("", t2)) 

Dies ist mein Versuch:

for(i in 1: length(MyFTable)){ 
    lapply(MyFTable[[i]],function(x) addHeaderRow(x, value=c("",t[[i]]))) 
} 

for(i in 1: length(MyFTable)){ 
    lapply(MyFTable[[i]],function(x) addHeaderRow(x[[i]], value=c("",t[[i]]))) 
} 

ich eine Fehlermeldung anzeigt:

x muss ein Flextable sein

Vielen Dank für Ihre Beratung.

+0

Warum plätschern Sie _in_ einer 'for'-Schleife? Verwenden Sie das eine oder das andere, und wenn Sie For-Loops verwenden möchten, weisen Sie sie vor. – alistaire

+0

Ich habe versucht, die erste Liste von df mit der ersten Liste von Namen – BIN

Antwort

1

Sie fügen lapply ohne triftigen Grund hinzu. Sie können das in einer normalen Schleife tun.

out <- vector("list", length(MyFTable)) # always pre-allocate 

for(i in 1:length(MyFTable)){ 
    out[[i]] <- addHeaderRow(MyFTable[[i]], value=c("",t[[i]]))) 
} 

Sie können auch mapply verwendet werden, die von allen vorgesehenen Objekte auf entsprechende Elemente arbeitet (in diesem Fall mft und tt).

myFun <- function(mft, tt) addHeaderRow(mft, tt) 
mapply(FUN = myFun, mft = MyFTable, tt = t) 

Wenn Sie versessen auf lapply sind, könnten Sie „eine Schleife verstecken“.

lapply(1:length(MyFTable), FUN = function(i, mft, tt) { 
    addHeaderRow(mft[[i]], value = c("", tt[[i]])) 
}, mft = MyFTable, tt = t) 

Dieses letzte Stück Code ist interessant, weil es einfach ist, zu zeigen, wie das Debuggen in R. arbeitet browser() an einem gewissen Punkt in einer Funktion Durch die Einstellung, die Ausführung an diesem Punkt zu stoppen und Sie können entweder Elemente oder vorab prüfen durch Eingabe von n oder c. Der erste Befehl bewegt sich eine Zeile vorwärts (von browser() Aufruf) und c wird die aktuelle "Schleife" ausführen und warten auf die browser() Zeile in der nächsten Schleife (wenn nicht fertig, dann ist es vorhanden).

Probieren Sie es aus, führen

lapply(1:length(MyFTable), FUN = function(i, mft, tt) { 
    browser() 
    addHeaderRow(mft[[i]], value = c("", tt[[i]])) 
}, mft = MyFTable, tt = t) 

und Ihre prompte sollte ein wenig ändern. Überprüfen Sie die Elemente i, mft und tt, und prüfen Sie, ob sie mit Ihren Elementen MyFTable[[1]] und t[[1]] übereinstimmen. Geben Sie zum Beenden Q ein.

+0

Also wenn ich eine andere Funktion MyFTable [1,1: 10, newpar = TRUE, to = "header"] <- c ("", zweite [ [i]]) Wie funktioniert es für die Anwendung Ihrer Funktion() – BIN

+0

Ich versuche für (i in 1: Länge (MyFTable)) {MyFTable [[i]] [1,1: 10, newpar = TRUE, bis = "header "] <- c (" ", zweite [[i]])} es funktioniert – BIN

+0

@Stat an dieser Stelle werde ich Sie bitten, eine neue Frage zu stellen und ein reproduzierbares Beispiel zu liefern. [Hier sind einige Tipps] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example), wie man genau das macht. –