以下代码允许用户更改显示的绘图数量。如果用户从sliderInput 8中选择2,则会在列中显示。我想在两个2x2的网格中显示8个图。如果用户从滑块输入中选择3,则将在3个网格中显示12个图,这些图都是2x2。
因此,您可以在下面的代码中看到,当前生成了8个图并且有标签,您可以在server.r文件的下面一行中看到这些标签:
print(plot_output_list)
do.call(tagList, plot_output_list)
标签如下:
<div id="plot5" class="shiny-plot-output" style="width: 400px ; height: 280px"></div>
生成这些标记后,renderPlot函数用于在循环中为它们分配绘图。这是代码行
output[[plotname]] <- renderPlot({ ......
这会在一列中生成8个图,但我希望有两个2x2网格。
我的问题是:
(1)我需要设置网格来显示4个图,所以我将使用:par(mfrow = c(2,2))但是我应该在哪里放置该代码。
(2)目前生成了8个标签。是否只生成2个标签,因为只有2个网格?
(3)如何在这里使用renderPlot?目前RenderPlot运行8次并产生8个图,但是它只能通过循环运行2次,因为只有2个网格?
不是这样的:http://www.cookbook-r.com/Graphs/Multiple_graphs_on_one_page_(ggplot2)/ 但R版3.1.2中没有“网格”包。
以下是您可以使用此代码运行的代码:
install.packages("shiny")
library(rJava
runApp("C://Users/me/folderTOProject")
Server.r
shinyServer(function(input, output,session) {
max_plots<- reactive({
print("IN reactive function")
NumberOfPlots(input$n)
})
# Insert the right number of plot output objects into the web page
output$plots <- renderUI({
#plot_output_list <- lapply(1:input$n, function(i) {
print("in render UI")
plot_output_list <- lapply(1:max_plots(), function(i) {
plotname <- paste("plot", i, sep="")
plotOutput(plotname, height = 280, width = 400)
})
print(plot_output_list)
# Convert the list to a tagList - this is necessary for the list of items
# to display properly.
do.call(tagList, plot_output_list)
}) #end of output$plots
# Call renderPlot for each one. Plots are only actually generated when they
# are visible on the web page.
observe({
for (i in 1:max_plots()) {
# for (i in seq(1, maxplots(), by=4)) { #use this to only loop twice
# par(mfrow=c(2,2)) #SET UP THE GRID to hold 4 plots..Should this be here?
# 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({
data<- as.data.frame(c(1,2,3))
plot(1:my_i, 1:my_i,
xlim = c(1, max_plots()),
ylim = c(1, max_plots()),
main = paste("1:", my_i, ". max plots is ", max_plots(), sep = "")
)
})#end of renderPlot
})#end of local
}#end of loop over max_plots
})
})#end of server
ui.r
shinyUI(pageWithSidebar(
headerPanel("tst"),
sidebarPanel(
sliderInput("n", "Number of plots", value=2, min=1, max=7),
width = 2
),
mainPanel(
# This is the dynamic UI for the plots
uiOutput("plots")
)
))
global.r
NumberOfPlots<-function(n)
{
print("in global")
print(n)
length(seq(from=1 , to=n*4, by = 1))
}
答案 0 :(得分:0)
您可以使用bootstrap rows and columns来完成8个单独的plotOutputs;或者两个plotOutputs每个都有一个2x2网格也可以正常工作。网格包不在CRAN上,但包含在R本身中。