Функция с openxlsx работает на консоли R, но не работает в Shiny - PullRequest
0 голосов
/ 23 октября 2019

Я пытаюсь написать функцию для обертывания некоторых фреймов данных для экспорта в Excel, используя пакет openxlsx. Сбой при запуске из функции downloadHandler в приложении Shiny, но отлично работает на консоли в R.

Обычный скрипт R, который работает нормально:

library(openxlsx)

datDf1 <- data.frame(grr = c(1:10),
                     hrm = c(11:20),
                     boo = c(21:30))
datDf2 <- data.frame(will = c(31:40),
                     this = c(41:50),
                     work = c(51:60))

addSheetFun <- function(df, datName){
  addWorksheet(wbExp, sheetName=datName)
  writeData(wbExp, sheet=datName, df)
  freezePane(wbExp, sheet=datName, firstRow=TRUE)
  setColWidths(wbExp, sheet=datName, widths="auto", cols=1:ncol(df))
}

wbExp <- createWorkbook()
addSheetFun(datDf1, "SheetOne")
addSheetFun(datDf2, "SheetTwo")

Сбой блестящего приложения:

ui.r

shinyUI(
  fluidPage(
    downloadButton("xlExl", "Click to Export")
  )
)

server.r

library(openxlsx)
library(shiny)

shinyServer(
  function(
    input, output, session
  ){
    addSheetFun <- function(df, datName){
      addWorksheet(wbExp, sheetName=datName)
      writeData(wbExp, sheet=datName, df)
      freezePane(wbExp, sheet=datName, firstRow=TRUE)
      setColWidths(wbExp, sheet=datName, widths="auto", cols=1:ncol(df))
    }

    output$xlExl <- downloadHandler(
      filename="Test.xlsx",
      content=function(file){
        datDf1 <- data.frame(grr = c(1:10),
                             hrm = c(11:20),
                             boo = c(21:30))
        datDf2 <- data.frame(will = c(31:40),
                             this = c(41:50),
                             work = c(51:60))
        wbExp <- createWorkbook()
        addSheetFun(datDf1, "SheetOne")
        addSheetFun(datDf2, "SheetTwo")
        saveWorkbook(wbExp, file, overwrite=TRUE)
      }
    )
  }
)

Ошибка при запуске из Shiny: «Предупреждение: ошибка в% в%: объект 'wbExp' не найден [трассировка стека недоступна]»

Я поэкспериментировал с этимверхняя часть addSheetFun:

if (exists("wbExp")) {
  wbExp <- wbExp
}
else {
  wbExp <- createWorkbook()
}

, а затем вызывается так:

wbExp <- addSheetFun(datDf1, "SheetOne")
wbExp <- addSheetFun(datDf2, "SheetTwo")

, но это только позволяет перезаписать первый лист вторым.

Мысли

1 Ответ

1 голос
/ 24 октября 2019

Ошибка объясняет, почему она не работает, она не может найти ваш wbExp.

Вероятно, самый простой способ устранить ошибку - использовать <<-, когда вы createWorkbook.

Так wbExp <<- createWorkbook(). Тогда ваше блестящее приложение должно работать.

Это похоже на 'superassignment' и назначит объект в родительской среде (рекомендуем прочитать http://adv -r.had.co.nz / Environments.html )

Кроме того, вы можете включить addSheetFun в downloadHandler непосредственно перед wbExp <- createWorkbook().

Итак server.R

library(openxlsx)
library(shiny)

shinyServer(
  function(
    input, output, session
  ){


    output$xlExl <- downloadHandler(
      filename="Test.xlsx",
      content=function(file){
        datDf1 <- data.frame(grr = c(1:10),
                             hrm = c(11:20),
                             boo = c(21:30))
        datDf2 <- data.frame(will = c(31:40),
                             this = c(41:50),
                             work = c(51:60))

        addSheetFun <- function(df, datName){
          addWorksheet(wbExp, sheetName=datName)
          writeData(wbExp, sheet=datName, df)
          freezePane(wbExp, sheet=datName, firstRow=TRUE)
          setColWidths(wbExp, sheet=datName, widths="auto", cols=1:ncol(df))
        }

        wbExp <- createWorkbook()
        addSheetFun(datDf1, "SheetOne")
        addSheetFun(datDf2, "SheetTwo")
        saveWorkbook(wbExp, file, overwrite=TRUE)
      }
    )
  }
)
...