我很擅长这一点,请原谅我 - 我正在Shiny中构建一个应用程序,它采用固定格式的上传数据文件,并根据用户选择呈现各种图表。该应用程序的一个重要部分是一组选项卡,每个选项卡包含一个图表。
我正在使用renderUI来渲染选项卡,但是我在渲染情节时遇到了很多困难。我已经尝试过renderPlot,outputPlot并且无法获得要显示的情节。我得到了各种错误但是下面的代码生成了“as.character(x)中的错误:无法在我们renderPlot(engPlot)的位置强制类型'character'的类型'闭包'。
ui.R
# Define UI
shinyUI(fluidPage(
# Application title
titlePanel("Chart Creation Tool"),
# Sidebar
sidebarLayout(
sidebarPanel(
fileInput("fileBlob", "Upload File", multiple = FALSE, accept = NULL),
selectInput("selectAnalysis", label=h3("Select Input"), choices=c("Month x Year", "Strategies", "Programs", "Segments")),
uiOutput("strategyList")
),
# Show a plot of the generated distribution
mainPanel(
uiOutput("mainPanel")
)
)
))
server.R的mainPanel部分
output$mainPanel <- renderUI ({
if (length(RawImport())==0L) {
out <- NULL
}else{
if (input$selectAnalysis=="Month x Year") {
dfAggMonth <- aggregate(cbind(Sent,Delivered,UniqueOpens,Responders,Bounced,Unsubscribes,TotalSpamComplaints,HardBounces,SoftBounces) ~ SentMonth + SentYear + SentMonthName, RawImport(), FUN = sum)
dfAggMonth <- addRatios(dfAggMonth)
dfAggMonth <- dfAggMonth[with(dfAggMonth, order(Date)), ]
engPlot <- runplot(paste(dfAggMonth$SentMonthName, dfAggMonth$SentYear,sep="-"), dfAggMonth$Date, dfAggMonth$Delivered, dfAggMonth$UniqueOpenRate, dfAggMonth$ResponderRate, "engagement", , "Temp Title")
out <- tabsetPanel(
tabPanel("Engagement", "Engagement", renderPlot(engPlot)),
tabPanel("Summary", "summary", "summary"),
tabPanel("Deliverability",runplot(paste(dfAggMonth$SentMonthName, dfAggMonth$SentYear,sep="-"), dfAggMonth$Date, dfAggMonth$Delivered, dfAggMonth$BounceRate, , "deliverability", , "Temp Title"))
)
}
else {
out <- tabsetPanel(
tabPanel("Tab 1", input$selectAnalysis),
tabPanel("Tab 2", input$selectAnalysis)
)
}
}
out
})
RunPlot函数
runplot <- function(xSeriesLabels, xSeriesValues, leftseries, rightseries1, rightseries2, chartType, columnSeries, xTitle){
if (missing(xTitle)==FALSE) {
strTitle <- xTitle
} else {
strTitle <- "no title supplied"
}
p <- barplot(leftseries, width=1, col=barCol, axisnames = leftseries, names.arg=xSeriesLabels, axis.lty=1, xlab=strTitle)
return(p)
}
答案 0 :(得分:1)
我发现当您运行的函数要在server.R
的{{1}}中运行时,通常会发生此错误。
所以你必须记住ui.R
将创建一个成熟的客户端UI。这意味着您在动态UI中返回的任何代码(即使它恰好存储在renderUI
中必须真正是server.R
中可能存在的有效客户端代码。这也意味着测试可以更容易,因为您可以将您尝试动态创建的代码(例如ui.R
tabsetPanel之一)移动到out
以查看它是否有效。这可能会使调试更容易在将来。
在这种情况下,我认为如果你这样做,你会看到的问题是ui.R
电话。由于您只是在这里创建动态UI,因此您希望在这种情况下使用与UI兼容的函数renderPlot
。然后在服务器端,您将为该输出分配一个图。
plotOutput("plotName")
当绘图可见时,您将执行所需的操作,并且在未显示绘图时将无效。