我正在尝试编写一个函数来包装一些数据帧,以便使用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
中包含addSheetFun
CCD_ 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)
}
)
}
)