openxlsx的函数在R控制台上工作,但在Shiny中失败



我正在尝试编写一个函数来包装一些数据帧,以便使用openxlsx包导出到Excel。当它从Shiny应用程序中的downloadHandler函数运行时失败,但在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")
)
)

服务器.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运行时,我得到的错误是:"警告:%in%中出现错误:找不到对象'wbExp'[无可用堆栈跟踪]">

我试着把这个钉到addSheetFun:的顶部

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

然后这样称呼它:

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

但是其仅设法用第二片材覆盖第一片材。

想法?

错误解释了它失败的原因,它找不到您的wbExp

克服错误的最简单方法可能是在createWorkbook时使用<<-

所以wbExp <<- createWorkbook()。那么你闪亮的应用程序应该可以工作了。

这就像"超级分配",将在父环境中分配对象(建议阅读http://adv-r.had.co.nz/Environments.html)

或者,您可以在downloadHandler中包含addSheetFunCCD_ 10。

所以服务器。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)
}
)
}
)

相关内容

最新更新