2016-09-27 4 views
3

Ich arbeite an der Erstellung eines dynamischen Rmarkdown-Dokuments. Das Endergebnis sollte eine Registerkarte für jede "Klassifizierung" in den Daten erstellen. Jede Registerkarte sollte eine Datentabelle aus dem DT-Paket mit den darauf gedruckten Daten enthalten. Unten ist der Code, den ich verwendet haben:Warum wird die Datentabelle nicht gedruckt, wenn der rmarkdown-Befehl wiederholt wird?

--- 
output: html_document 
--- 

# Setup{.tabset} 
```{r setup, include=FALSE} 
knitr::opts_chunk$set(echo = FALSE) 
library(knitr) 
library(DT) 
``` 

```{r data.setup} 
set.seed = 1242 
rows = 64 
data.1 = runif(rows, 25, 75) 
data.2 = runif(rows, .01, 1) 
data.3 = runif(rows, 1, 10) 
classification = c("A", "B", "C", "D") 
df = data.frame(cbind(data.1 = data.1, data.2 = data.2, data.3 = data.3, classification = classification)) 
df$data.1 = as.numeric(df$data.1) 
df$data.2 = as.numeric(df$data.2) 
df$data.3 = as.numeric(df$data.3) 
``` 

```{r results= 'asis'} 
for(j in levels(df$classification)){ 
     df.j = df[df$classification == j, ] 
     cat(paste("\n\n## Classification: ", j, "##\n")) 
     w = datatable(df.j) 
     #datatable(df.j) 
     print(w) 
} 
``` 

Hinweis Ich habe die Datentabelle Funktion gerade Anrufe auf Kommentar, um rmarkdown diejenigen, die nicht druckten. Die Ergebnisse des Aufrufs, so wie sie geschrieben wurden, erzeugen ein HTML-Dokument mit den richtigen Tabs, aber keine Databases in ihnen. Darüber hinaus werden die Databases tatsächlich in meiner RStudio-Sitzung mit der richtigen Teilmenge angezeigt. Als Test habe ich versucht, das Ziel mit der Kable-Funktion von Knitr zu erreichen, und die Tabellen wurden in den entsprechenden Tabs gedruckt, leider verfügt kable nicht über alle erforderlichen Funktionen.

Antwort

3

Dies ist keine vollständige Antwort, da einige davon mich immer noch rätseln, aber zumindest ist das gut genug, um Sie in Gang zu bringen, während ich versuche, etwas mehr zu verstehen.

--- 
output: html_document 
--- 

# Setup{.tabset} 
```{r setup, include=FALSE} 
knitr::opts_chunk$set(echo = FALSE) 
library(knitr) 
library(DT) 
``` 

```{r data.setup} 
set.seed <- 1242 
rows <- 64 
data.1 <- runif(rows, 25, 75) 
data.2 <- runif(rows, .01, 1) 
data.3 <- runif(rows, 1, 10) 
classification <- c("A", "B", "C", "D") 
df <- data.frame(cbind(data.1 = data.1, data.2 = data.2, data.3 = data.3, classification = classification)) 
df$data.1 <- as.numeric(df$data.1) 
df$data.2 <- as.numeric(df$data.2) 
df$data.3 <- as.numeric(df$data.3) 
``` 

```{r include = FALSE} 
# Why, oh why do I need this chunk? 
datatable(df) 
``` 

```{r results = 'asis'} 
for(j in unique(df$classification)){ # You were using level() here, so your for-loop never got off the ground 
     df.j <- df[df$classification == j, ] 
     cat(paste("\n\n## Classification: ", j, "##\n")) 
     print(htmltools::tagList(datatable(df.j))) 
} 

Der dritte Brocken ist erforderlich, damit dies funktioniert, ich bin mir noch nicht sicher warum.

+0

+1 Ich habe weit und breit für eine einfache Lösung suchen und das war es. Beachten Sie, dass Sie im dritten Chunk 'datatable (df [1,])' 'eingeben können und es wird trotzdem funktionieren! Ich frage mich, ob @yihui weiß, warum das notwendig ist – bouncyball

1

Hier erreichen, indem Sie die gleiche Frage googeln. Das hat bei mir funktioniert: https://gist.github.com/ReportMort/9ccb544a337fd1778179.

Generieren Sie im Grunde eine Liste der gerenderten tibbles und rufen Sie manuell knit.

Hier ist ein funktionierendes Rmd basierend auf Ihrem Beispiel die Technik in dem obigen Link gefunden werden:

--- 
output: html_document 
--- 

# Setup{.tabset} 
```{r setup, include=FALSE} 
knitr::opts_chunk$set(echo = FALSE) 
library(knitr) 
library(DT) 
``` 

```{r data.setup} 
set.seed <- 1242 
rows <- 64 
data.1 <- runif(rows, 25, 75) 
data.2 <- runif(rows, .01, 1) 
data.3 <- runif(rows, 1, 10) 
classification <- c("A", "B", "C", "D") 
df <- data.frame(cbind(data.1 = data.1, data.2 = data.2, data.3 = data.3, classification = classification)) 
df$data.1 <- as.numeric(df$data.1) 
df$data.2 <- as.numeric(df$data.2) 
df$data.3 <- as.numeric(df$data.3) 
``` 

```{r include = FALSE} 
# prepare a list of 4 sub-dataframes, each corresponding to one classification 
df_list <- split(df, df$classification) 
``` 

```{r create-markdown-chunks-dynamically, include=FALSE} 

out = NULL 
for (c in names(df_list)) { 
    knit_expanded <- paste0("\n\n## Classification: ", c, "##\n\n```{r results='asis', echo=FALSE}\n\ndatatable(df_list[['", c, "']])\n\n```") 
    out = c(out, knit_expanded) 
} 

``` 

<!--- knit those table chunk statements --> 
`r paste(knit(text = out), collapse = '\n')` 
Verwandte Themen