Как встраивать изображения в список данных? - PullRequest
0 голосов
/ 14 февраля 2019

Этот вопрос связан с постом, который я сделал несколько недель назад здесь .Я пытаюсь вставить QR-коды в новый столбец в списке данных.QR-код будет содержать числовой результат из другого столбца и может быть отсканирован в нашу лабораторную информационную систему.До сих пор я мог генерировать кадр данных со столбцом, содержащим QR-коды, используя RMarkdown, но я не могу сделать это, когда пытаюсь адаптировать этот код к списку кадров данных.

Вот пример того, что мне нужно с одним фреймом данных:

---
title: "QR Code in Column"
author: "dorton"
date: "2019/01/20"
output: pdf_document
---

```{r mychunk1, fig.show = "hide", echo = FALSE, message=FALSE, warning=FALSE, out.width="72px", include=TRUE}
library(knitr)
library(qrcode)

test <- LETTERS[1:10]
result.one <- round(rnorm(1:10),2)
df <- data.frame(test, result.one, stringsAsFactors = FALSE)
df$result.one <- as.character(df$result.one) #qrcode_gen needs a character input    

invisible(lapply(df$result.one, function(x) qrcode_gen(x)))

out <- cbind(as.character(df$test), 
             as.character(df$result.one), 
             include_graphics(sprintf("![](%s%s-%s.png){width=72px}", 
                                 opts_current$get("fig.path"), 
                                 opts_current$get("label"), 
                                 1:nrow(df))))
kable(out, col.names = c("ID", "Text", "Code"))
```

В действительности у меня есть список фреймов данных, содержащих «результаты» для «теста» AJ.Что я хочу, так это циклически проходить по списку фреймов данных и вставлять QR-коды в каждый фрейм данных, но я не могу понять, как это сделать.Вот пример попытки, которая не работает:

```{r mychunk, fig.show = "hide", echo = FALSE, message=FALSE, warning=FALSE, out.width="72px"}

library(knitr)
library(qrcode)

test <- LETTERS[1:10]
result.one <- round(rnorm(1:10),2))
result.two <- round(rnorm(11:20), 2)
df1 <- data.frame(test, result.one, stringsAsFactors = FALSE)
df2 <- data.frame(test, result.two, stringsAsFactors = FALSE)
df1$result.one <- as.character(df1$result.one)
df2$result.two <- as.character(df2$result.two)
colnames(df1) <- c("test", "result")
colnames(df2) <- c("test", "result")

df.list <- list(df1, df2)

for (i in length(df.list)){
  invisible(lapply(df.list[[i]]$result, function(x) qrcode_gen(x)))

  out <- cbind(as.character(df.list[[i]]$test), 
             as.character(df.list[[i]]$result), 
             include_graphics(sprintf("![](%s%s-%s.png){width=72px}", 
                                 opts_current$get("fig.path"), 
                                 opts_current$get("label"), 
                                 1:nrow(df.list[[i]]))))
}

  for (i in df.list){
  cat("\n\\newpage\n") #This is to add a page break between output tables. I would like to use a pdf output, but I'm not stuck on it.
  kable(out.qr, col.names = c("Test", "Result", "Code"), caption = paste0("Sample ID"))
}

```

Я пробовал несколько разных итераций второго фрагмента кода.Я ожидаю, что это как-то связано с тем, где сохраняются png, которые я генерирую с invisible(lapply(df.list[[i]]$result, function(x) qrcode_gen(x))), но я не могу найти альтернативу.Могу ли я создать список списков для png?Должен ли я?

Любая помощь очень ценится, и я тоже не застрял на использовании rmarkdown!

1 Ответ

0 голосов
/ 14 февраля 2019

Это было немного сложно понять, и душа не могла быть настолько изящной, насколько это возможно.Но это работает.Если я найду время завтра, я попытаюсь углубиться в это.

Обратите внимание, что qrcodes пронумерованы от 1 до общего количества строк во всех фреймах данных.Поэтому мы должны позаботиться об этом, используя счетчик total и сохранить количество кодов для каждого кадра данных при их создании (в nums).


---
title: "QR Code in Column"
author: "dorton"
date: "2019/01/20"
output: pdf_document     
---


```{r mychunk, echo = FALSE, fig.path =  "qr/", results = 'asis', fig.show='hide'}
library(knitr)
library(qrcode)
df.list <- list(A = data.frame(result = as.character(rnorm(2)),                    
                               test = LETTERS[1:2], stringsAsFactors = F),
                B = data.frame(result = as.character(rnorm(2)),
                               test = LETTERS[3:4], stringsAsFactors = F))

nums <- invisible(sapply(df.list, function(df) {
  lapply(df$result, qrcode_gen)  # create qrcode
  nrow(df)                       # save number of rows of df
}))

path <- paste0(opts_current$get("fig.path"), opts_current$get("label"), "-")

total <- 0
for(i in seq_along(nums)) {
  out <- cbind(df.list[[i]]$test,
               df.list[[i]]$result,
               paste0("![](", path, (1:nums[i]) + total, ".pdf){width=72px}")) 

  print(kable(out))
  total <- total + nums[1] 
}
```

enter image description here

...