我想创建一个使用闪亮的应用程序,动态地将图表添加到页面。它可能是10个地块,它可能只有一个。我在闪亮的主页中使用this tutorial来获取动态UI。
这是一个简化的例子。
函数showme
正在绘制图形
shinyServer(function(input, output) {
# Create an environment for storing data
symbol_env <- new.env()
# Make a chart for a symbol, with the settings from the inputs
make_chart <- function(symbol) {
showme(symbol)
}
display <- c("1083484" , "1101732")
output$MyList <- renderUi({
for (i in i:nrow(display))
renderPlot({make_chart(display[i])})
})
})
shinyUI(pageWithSidebar(
headerPanel("My Plots !"),
sidebarPanel(
wellPanel(
p(strong("Scan1"))))
,mainPanel(
uiOutput("MyList")
)))
我收到以下错误
Listening on port 8100
Error in .subset2(x, "impl")$defineOutput(name, value, deparse(substitute(value))) :
Unexpected character output for display
如果不是这样的话 - 我会感激任何指导。 感谢。
> sessionInfo()
R version 2.15.3 (2013-03-01)
Platform: i386-w64-mingw32/i386 (32-bit)
答案 0 :(得分:26)
或许这个例子归功于Winston Chang:
Shiny example app with dynamic number of plots
以下是linkrot的完整示例:
<强> server.R 强>
max_plots <- 5
shinyServer(function(input, output) {
# Insert the right number of plot output objects into the web page
output$plots <- renderUI({
plot_output_list <- lapply(1:input$n, function(i) {
plotname <- paste("plot", i, sep="")
plotOutput(plotname, height = 280, width = 250)
})
# Convert the list to a tagList - this is necessary for the list of items
# to display properly.
do.call(tagList, plot_output_list)
})
# Call renderPlot for each one. Plots are only actually generated when they
# are visible on the web page.
for (i in 1:max_plots) {
# Need local so that each item gets its own number. Without it, the value
# of i in the renderPlot() will be the same across all instances, because
# of when the expression is evaluated.
local({
my_i <- i
plotname <- paste("plot", my_i, sep="")
output[[plotname]] <- renderPlot({
plot(1:my_i, 1:my_i, xlim = c(1, max_plots), ylim = c(1, max_plots), main = paste("1:", my_i, ". n is ", input$n, sep = ""))
})
})
}
})
<强> ui.R 强>
shinyUI(pageWithSidebar(
headerPanel("Dynamic number of plots"),
sidebarPanel(
sliderInput("n", "Number of plots", value=1, min=1, max=5)
),
mainPanel(
uiOutput("plots") # This is the dynamic UI for the plots
)
))
答案 1 :(得分:4)
要回答上面评论中的问题,关于如何动态返回对象列表(例如,绘图,表格和文本),您可以生成包含在div标签中的相应输出的列表。然后,renderUI与for循环中的相应渲染函数匹配。例如:
max_plots <- 5
shinyServer(function(input, output) {
# Insert the right number of plot output objects into the web page
output$plots <- renderUI({
plot_output_list <- lapply(1:input$n, function(i) {
plotname <- paste("plot", i, sep="")
plottitle <- paste("plottitle", i, sep="")
tablename <- paste("tablename", i, sep="")
tags$div(class = "group-output",
textOutput(plottitle, container = h3),
plotOutput(plotname, height = 280, width = 250),
tableOutput(tablename)
)
})
# Convert the list to a tagList - this is necessary for the list of items
# to display properly.
do.call(tagList, plot_output_list)
})
# Call renderPlot for each one. Plots are only actually generated when they
# are visible on the web page.
for (i in 1:max_plots) {
# Need local so that each item gets its own number. Without it, the value
# of i in the renderPlot() will be the same across all instances, because
# of when the expression is evaluated.
local({
my_i <- i
plotname <- paste("plot", my_i, sep="")
plottitle <- paste("plottitle", my_i, sep="")
tablename <- paste("tablename", my_i, sep="")
output[[plotname]] <- renderPlot({
plot(1:my_i, 1:my_i, xlim = c(1, max_plots), ylim = c(1, max_plots), main = paste("1:", my_i, ". n is ", input$n, sep = ""))
})
output[[plottitle]] <- renderText({paste("1:", my_i, ". n is ", input$n, sep = "")
})
output[[tablename]] <- renderTable({table(x = 1:my_i, y = 1:my_i)
})
})
}
})
我希望有所帮助!
答案 2 :(得分:0)
使用闪亮动态添加N个绘图:
runApp(
list(
ui = fluidPage(
headerPanel('Tittle'),
sidebarPanel(
fileInput('file1', 'Choose File:'),
textInput("target", label="Target", value="Choose target"),
actionButton("addButton", "Go!"),
p('The button start the code server'),
p("This is UI")
),
mainPanel(
uiOutput("plots")
)),
#SERVER
server = function(input, output) {
dataset <- eventReactive(input$addButton, {
#Obtain the file and textinput
inFile <- input$file1
df <- read.csv(inFile$datapath)
df$target <- input$target
return(df)
})
output$plots <- renderUI({
df <- dataset()
n <- df$target[1]
plot_output_list <- lapply(1:n, function(i) {
plotname <- paste("plot", i, sep="")
plotOutput(plotname, height = 580, width = 550)
})
do.call(tagList, plot_output_list)
})
observe({
for (i in 1:length()) {
local({
plotname <- paste("plot", i, sep="")
output[[plotname]] <- renderPlot({
#function_plot is the function generate plot
function_plot()
})
})#endlocal
}
})
}
)
)
https://github.com/ericbellet/recomendacion-modelos/blob/master/shiny/generate_rocSHINY.R