Объединение табличного содержимого библиотеки (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)
содержание?