Объединение табличного содержимого библиотеки (xlsx) и редактируемого графического содержимого библиотеки (rvg) на одной вкладке Excel

В ответ на о это сообщениепереполнении стека при экспорте графического содержимого блестящего приложения R в Excel, пользователь ismirsehregal предлагает хорошее решение для объединения редактируемого графического содержимого, созданного с помощью / packages, в ту же книгу, что и содержимое, созданное с помощью добавления нового выделенного листа. к содержанию rvg / Officer.

Я пытаюсь сделать что-то подобное, но хотел бы добавить редактируемое содержимое графа, созданное с помощью пакетов rvg / Officer, на тот же лист, что и табличное содержимое, вместо того, чтобы хранить их на отдельных листах. Однако, когда я пытаюсь добавить / content на тот же лист, что и library(openxlsx) содержимое через блестящий код приложения R ниже, артефакт Excel не отображает содержимое rvg / Officer(он отображает только исходное содержимое).

      library(shiny)
library(ggplot2)
library(officer)
library(rvg)
library(xlsx)
library(data.table)

data("mpg")

ui <- fluidPage(
  downloadButton('Export', label = 'Click here to export content')
)

server <- function(input, output) {
  
  # generate table from mpg data
  mpg.dt <- as.data.table(mpg)
  mpg.dt[, hwy_avg := mean(hwy), by=class]
  mpg.dt[, classIndex := 1:.N, by = class]
  mpg.table <- mpg.dt[which(classIndex==1),c("class", "hwy_avg")] 
  mpg.table <- as.data.frame(mpg.table)
  
  # specify function to add tablar content to xlsx-compatible file
  xlsx.addcell1<-function(sheet, rows,colIndex,title) {
    sheetTitle <-createCell(rows, colIndex=colIndex)
    setCellValue(sheetTitle[[1,1]], ifelse((is.na(title)),"-",title))
  }
  
  # download handler
  output$Export <- downloadHandler(
    
    filename = function() {
      timedatestamp <- Sys.time()
      timedatestamp <- gsub(":","-",timedatestamp)
      paste0("artifact ", timedatestamp, ".xlsx")
    },
    
    content = function(file){
  
      # create initial file for tabular content using xlsx package
      shell <- xlsx::createWorkbook()
      createSheet(shell, "Content")
      sheets<-getSheets(shell)
      
      # populate tabular data
      rows <-createRow(sheets[[1]],rowIndex=1)
      xlsx.addcell1(sheets[[1]], rows, 1, "class")
      xlsx.addcell1(sheets[[1]], rows, 2, "hwy_avg")
      
      for(i in 1:nrow(mpg.table)){
        rows <-createRow(sheets[[1]],rowIndex=1+i)
        for(j in 1:ncol(mpg.table)){
          xlsx.addcell1(sheets[[1]], rows, j, mpg.table[i,j])
        }
      }
      
      tmpwb <- tempfile(fileext = ".xlsx")
      xlsx::saveWorkbook(shell, tmpwb)
      
      # convert xlsx file to rxlsx and delete temp file
      wbShell_officer <- read_xlsx(tmpwb)
      file.remove(tmpwb)
      
      # add editable graph content into rxlsx file
      mpgPlot <-ggplot(data = mpg.table,  aes(x = class , y = hwy_avg)) + geom_bar(stat = "identity")
      
      wbShell_officer <- add_sheet(wbShell_officer, label = "mpgPlot")
      wbShell_officer <- xl_add_vg(wbShell_officer, sheet = "mpgPlot", code = print(mpgPlot), width = 5, height = 5, left = 1, top = 1)
      
      print(wbShell_officer, target = file)
      
    }
  )
}

shinyApp(ui, server)

Обратите внимание, что если я запускаю ту же программу, но заменяю следующие две строки на одну соответствующую (предпоследнюю) строку в приведенном выше блоке кода, тем самым сохраняя / на отдельных вкладках, приложение успешно отображает редактируемое содержимое графа в дополнительных лист:

      wbShell_officer <- add_sheet(wbShell_officer, label = "mpgPlot")
wbShell_officer <- xl_add_vg(wbShell_officer, sheet = "mpgPlot", code = print(carPlot), width = 5, height = 5, left = 1, top = 1)

Есть ли способ получить редактируемый library(rvg)/ library(officer) содержимое для отображения на том же листе, что и табличный library(xlsx) содержание?

0 ответов

Другие вопросы по тегам