2016-06-14 23 views
1

Ich arbeite derzeit an das Stricken einer R-Markup-Datei in PDF mit dem folgenden Code Chunk/Funktion inspiriert durch Benutzer Carlos Cinelli. Die benutzerdefinierte Abschlag Funktion ist der folgende:Overlapping Columns stricken R Markdown to PDF

```{r set-options, echo = FALSE, results = 'asis'} 
rmarkdownTable <- function(df){ 
    cat(paste(names(df), collapse = "|")) 
    cat("\n") 
    cat(paste(rep("-", ncol(df)), collapse = "|")) 
    cat("\n") 

    for(i in 1:nrow(df)){ 
    cat(paste(df[i,], collapse = "|")) 
    cat("\n") 
    } 
invisible(NULL) 
} 

rmarkdownTable(CurrentTableData) 
``` 

CurrentTableData ist ein data.frame mit einer Zeichenklasse Spalte (ID) und numerischer Klasse Spalten anders. Ich habe diese Funktion bereits verwendet, um andere Datenrahmen ohne Probleme in PDF, HTML und Word zu rendern.

Wenn Sie es jedoch mit CurrentTableData ausführen, wird die Ausgabetabelle gekürzt und die Spalten/Spaltenüberschriften überlappen sich. Ich habe die folgende ausgedruckt die Daten I (mit dput für Reproduzierbarkeit) müssen nachweisen, und die Probleme, die ich renne in:

CurrTableDataList <- dput(head(CurrentTableData)) 

structure(list(ASIN = c("B0000004Y8", "B000000OQI", "B000000XB8", 
"B0000017CI", "B000001A3H", "B000001ELB"), `NewPrice USD` = c("34.77", 
"27.61", "21.49", "14.13", "16.49", "14.61"), `CurrentPrice USD` = c("43.50", 
"35.98", "24.98", "12.98", "19.98", "19.98"), `FBAfees USD` = c("8.72", 
"7.56", "6.68", "5.53", "5.88", "5.60"), `AddFees USD` = c("4.80", 
"3.82", "2.97", "1.96", "2.28", "2.01"), `Cost USD` = c("20.78", 
"14.63", "10.09", "6.48", "6.95", "5.30"), `AllFees USD` = c("34.30", 
"26.01", "19.74", "13.97", "15.11", "12.91"), `NewProfit USD` = c("0.47", 
"1.60", "1.75", "0.16", "1.38", "1.70"), `NewProfit CAD` = c("0.60", 
"2.05", "2.24", "0.21", "1.77", "2.18"), `CurrentProfit CAD` = c("3.27", 
"1.48", "1.81", "1.53", "1.56", "0.52"), `New % Profit` = c("2.25", 
"10.93", "17.32", "2.53", "19.87", "32.11"), `Current % Profit` = c("22.22", 
"8.22", "14.55", "18.43", "18.22", "7.91"), SalesRank = c(10153, 
4809, 550, 13569, 6647, 5164)), .Names = c("ASIN", "NewPrice USD", 
"CurrentPrice USD", "FBAfees USD", "AddFees USD", "Cost USD", 
"AllFees USD", "NewProfit USD", "NewProfit CAD", "CurrentProfit CAD", 
"New % Profit", "Current % Profit", "SalesRank"), row.names = c(NA, 
6L), class = "data.frame") 

Beispiel problematische Ausgabe:

Overlapping Columns Output

Als Erwähnenswert ist, dass die obige problematische Ausgabe die Spaltennamen umschließt, während meine vorherigen Ausgaben dies nicht taten (nicht notwendigerweise eine schlechte Sache, aber es ist etwas, was ich bemerkt habe - es wurden keine Änderungen an der Markdown-Funktion vorgenommen und die Spaltennamen waren für die anderen Ausgaben identisch). Ich habe versucht, die Größe zu ändern mit Optionen (Breite = # eine kleine Zahl) sowie in der Ausgabe: pdf_document: Dimensionen in der Hoffnung, dass es helfen könnte/passen Sie die Spalten auf der Seite, aber kein Glück.

Ich bin in R-Version 3.3.0 (2016-05-03) und läuft x86_64-Apple-Darwin13.4.0 (64-Bit).

+0

Möchten Sie Ihre eigene Funktion verwenden? Dies könnte einfacher erreicht werden, indem zum Beispiel 'xtable()' aus dem Paket mit dem gleichen Namen verwendet wird. – Alex

Antwort

1

Die Art, wie Sie die Größe der Spalten steuern können, ist über die - Zeichen. Um es klar:

ASIN|NewPrice USD|CurrentPrice USD|FBAfees USD|AddFees USD|Cost USD|AllFees USD|NewProfit USD|NewProfit CAD|CurrentProfit CAD|New % Profit|Current % Profit|SalesRank 
-|-|-|-|-|-|-|-|-|-|-|-|- 
B0000004Y8|34.77|43.50|8.72|4.80|20.78|34.30|0.47|0.60|3.27|2.25|22.22|10153 
B000000OQI|27.61|35.98|7.56|3.82|14.63|26.01|1.60|2.05|1.48|10.93|8.22|4809 
B000000XB8|21.49|24.98|6.68|2.97|10.09|19.74|1.75|2.24|1.81|17.32|14.55|550 
B0000017CI|14.13|12.98|5.53|1.96|6.48|13.97|0.16|0.21|1.53|2.53|18.43|13569 
B000001A3H|16.49|19.98|5.88|2.28|6.95|15.11|1.38|1.77|1.56|19.87|18.22|6647 
B000001ELB|14.61|19.98|5.60|2.01|5.30|12.91|1.70|2.18|0.52|32.11|7.91|5164 

enter image description here

ASIN|NewPrice USD|CurrentPrice USD|FBAfees USD|AddFees USD|Cost USD|AllFees USD|NewProfit USD|NewProfit CAD|CurrentProfit CAD|New % Profit|Current % Profit|SalesRank 
-------------|-|-|-|-|-|-|-|-|-|-|-|- 
B0000004Y8|34.77|43.50|8.72|4.80|20.78|34.30|0.47|0.60|3.27|2.25|22.22|10153 
B000000OQI|27.61|35.98|7.56|3.82|14.63|26.01|1.60|2.05|1.48|10.93|8.22|4809 
B000000XB8|21.49|24.98|6.68|2.97|10.09|19.74|1.75|2.24|1.81|17.32|14.55|550 
B0000017CI|14.13|12.98|5.53|1.96|6.48|13.97|0.16|0.21|1.53|2.53|18.43|13569 
B000001A3H|16.49|19.98|5.88|2.28|6.95|15.11|1.38|1.77|1.56|19.87|18.22|6647 
B000001ELB|14.61|19.98|5.60|2.01|5.30|12.91|1.70|2.18|0.52|32.11|7.91|5164 

enter image description here

ich Ihre Funktion ein wenig angepasst:

rmarkdownTable <- function(df, x){ 
    cat(paste(names(df), collapse = "|")) 
    cat("\n") 
    col_length <- function(x) paste(rep('-', x), collapse = '') 
    cat(paste(sapply(x,col_length), collapse = "|")) 
    cat("\n") 

    for(i in 1:nrow(df)){ 
    cat(paste(df[i,], collapse = "|")) 
    cat("\n") 
    } 
invisible(NULL) 
} 

Der Vektor x, der die Länge der sollte Anzahl der Spalten, die Sie haben, teilt der Funktion wie viele - muss es in jeder Spalte enthalten.

Anmerkung: Es scheint, dass, wenn Ihr Tisch zu groß ist, um auf eine Seite zu passen, das Verhältnis der Anzahl der - Zeichen wichtig ist. Wenn also jede Spalte 1000 hat, sieht es genauso aus, als ob jede Spalte nur 1 - hat.

Weitere Bemerkung: Ich empfehle ein Paket wie xtable zu verwenden. Es macht einen ziemlich guten Job und ist weniger Arbeit für Sie.

+0

Große, gründliche Antwort: Ich schätze die Änderungen am Code und werde definitiv auf 'xtable()' für zukünftige Verwendung schauen. Vielen Dank! –