Несколько таблиц Kable с изображениями - PullRequest
0 голосов
/ 21 октября 2018

Я пытаюсь создать несколько таблиц, используя kable из файла CSV, но требуется, чтобы мне также нужно было поместить изображение в таблицу, как показано на рисунке ниже.Все изображение должно быть в левом столбце.Возможно ли это?

Sample Output

Структура данных выглядит следующим образом:

df<-data.frame(Amount= c('$25', '$45', '$75'), 
               Rate = c('1%', '1%', '3%'), 
               Location = c('Germany', 'Switzerland', 'England'),
               ImageName= c('GE.png', 'BE.png', 'CE.png'),
               Status = c('Sold','Unsold','Sold')
               )

Пока мой код R равен

---
output: 
  word_document:
    reference_docx: ReferenceDoc.docx
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)

df<-read.csv('Productdata.csv')
```

```{r loops, echo=F, results='asis'}
library(knitr)
for (i in 1:nrow(df))
{

print(kable(df[i,]))
}
```

Я действительно не уверен, как я могу ввести такое изображение в RMarkdown for WORD.

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Вот подход, использующий kable, наряду с kableExtra функциями, чтобы позаботиться о некотором форматировании.До сих пор я только смог правильно отобразить это в html.Я обновлю, смогу ли я сделать это в Word.В приведенном ниже коде я использовал несколько изображений, которые случайно оказались вокруг.Просто запустите ту же функцию sprintf в исходном столбце ImageName, чтобы получить соответствующие теги rmarkdown для ваших изображений.

---
output:
  html_document:
    df_print: paged
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE, warning=FALSE, message=FALSE)
library(knitr)
library(kableExtra)
library(tidyverse)

#df<-read.csv('Productdata.csv')
df<-data.frame(Amount= c('$25', '$45', '$75'), 
               Rate = c('1%', '1%', '3%'), 
               Location = c('Germany', 'Switzerland', 'England'),
               ImageName= c('GE.png', 'BE.png', 'CE.png'),
               Status = c('Sold','Unsold','Sold')
               )

# Change to names of my local images
df$ImageName =c("mal2.jpg",
                "serenity2.jpg",
                "blue_sun2.jpg")

# Add appropriate rmarkdown tagging
df$ImageName = sprintf("![](%s)", df$ImageName)
```

```{r loops, echo=F, results="asis"}
for (i in 1:nrow(df)) {

  # Select desired row
  d = df[i, ]

  # Change name of ImageName column to Status value
  names(d)[grep("ImageName", names(d))] = as.character(d[["Status"]])

  # Convert data to "long" format
  d = d %>% 
    select(-Status) %>% 
    gather(Product, value, Amount:Location) %>% 
    rename(` ` = value)

  # Render table using kableExtra for formatting
  print(kable(d, format="html") %>% 
          kable_styling(full_width=FALSE) %>% 
          collapse_rows(columns=1, valign="top"))
}
```

И вот как выглядит выходной html-файл:

enter image description here

0 голосов
/ 22 октября 2018

Я думаю, что это может выйти за пределы kable, но вот очень не элегантный способ сделать что-то подобное с htmlTable.Обратите внимание, что изображения относятся к каталогу, из которого вы запускаете Rmd, или вы можете использовать ссылки на URL-адреса.

---
output:
  html_document:
    df_print: paged
  word_document:
    reference_docx: ReferenceDoc.docx
---

```{r setup, echo=FALSE, message=FALSE, warning=FALSE, results='asis'}
library(knitr)
library(dplyr)
library(magrittr)
library(htmlTable)

x <- 0
df <- data.frame( Status = c('Sold','Unsold','Sold'),
           Image = c('images/fwhm1.jpg', 'images/ridges-shade.jpg', 'images/sep16-2018.jpg'),
           Amount= c('$25', '$45', '$75'), 
           Rate = c('1%', '1%', '3%'), 
           Location = c('Germany', 'Switzerland', 'England')
           )
df$Image <- sprintf('![](%s){width=150px}', df$Image)

for (i in 1:nrow(df)) {
   x <- t(df[i,])
   new.df <- data.frame(matrix(ncol=2,nrow=2))
   new.df[1,1] <- paste(x[1],x[2],sep="<br>")
   new.df[1,2] <- paste0(rownames(x)[3:5], ": ", x[3:5], collapse="<br>")
   colnames(new.df) <- NULL
   rownames(new.df) <- NULL
   print( htmlTable(new.df, 
      css.cell="padding-left: .5em; padding-right: .5em; align: left; align: left; vertical-align: top;",
   rnames=FALSE) )
}
```

Вот как это выглядит:

enter image description here

Я также открыл файл HTML, который отображался в Word, и смог уменьшить изображения и добавить границы - структура таблицы была сохранена.Выглядело это так:

enter image description here

...