我想创建使用闪亮的动态添加地块到页面的应用程序。 它可能是10个地块,它可能是唯一的一个。 我使用本教程中闪亮的网页动态UI。
这是一个简化的例子。 功能showme
被ploting图表
server.r
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])})
})
})
ui.r
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)
Answer 1:
也许这个例子中,由于温斯顿常是有帮助的:
与曲线的动态数光泽示例应用
下面是完整的例子只是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
)
))
Answer 2:
要回答的评论上面的问题,如何动态地返回对象的列表(例如,一个小区,一个桌子和一个文本),您可以生成在renderUI您包含在一个div标签,然后适当输出的列表配合适当的渲染功能,在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)
})
})
}
})
我希望帮助!
Answer 3:
动态添加了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
文章来源: dynamically add plots to web page using shiny