Shiny Shining'中奇怪的实际参数赋值;s渲染图

Shiny Shining'中奇怪的实际参数赋值;s渲染图,shiny,output,rendering,Shiny,Output,Rendering,当使用for循环渲染某些绘图时,我得到了我不理解的结果。所有绘图都与(预期的)最后一个绘图相等。我希望在下面的例子中更清楚地说明这一点。注:图1显示的是“6”(最后一个),而不是“5”(如预期)。 任何人都可以解释这一点和/或给出避免此类行为的解决方案。 闪亮的用户界面: shinyUI (fluidPage( fluidRow ( column (6, plotOutput ('plot1', height = "180px")), column (6, plotOutput

当使用for循环渲染某些绘图时,我得到了我不理解的结果。所有绘图都与(预期的)最后一个绘图相等。我希望在下面的例子中更清楚地说明这一点。注:图1显示的是“6”(最后一个),而不是“5”(如预期)。 任何人都可以解释这一点和/或给出避免此类行为的解决方案。
闪亮的用户界面:

shinyUI (fluidPage(
fluidRow (
    column (6, plotOutput ('plot1', height = "180px")),
    column (6, plotOutput ('plot2', height = "180px"))
),
fluidRow (
    column (6, plotOutput ('plot3', height = "180px")),
    column (6, plotOutput ('plot4', height = "180px"))
)
))
闪亮服务器:

shinyServer (function (input, output, session) {
require (ggplot2)
plotId      <- c('plot1', 'plot2', 'plot3', 'plot4')
pw          <- initPlotWindows ()   
output[['plot1']] <- renderPlot ({pw[[1]]})
output[['plot2']] <- renderPlot ({pw[[2]]})
output[['plot3']] <- renderPlot ({pw[[3]]}) 
output[['plot4']] <- renderPlot ({pw[[4]]})
id  <- 'plot1'
i   <- 5
output[[id]] <- renderPlot ({pw[[i]]})
id  <- 'plot3'
i   <- 6
# output[[id]] <- renderPlot ({pw[[i]]})
})  

initPlotWindows <- function () {
    pw          <- vector (mode = 'list', length = 6)                           # plot window data
    for (i in 1:6)  pw[[i]] <- p_empty (plotN = i)
    pw
}
p_empty <- function (plotN) {
    p <- ggplot()
    p <- p + annotate("text", label = plotN, x = .5, y = .5, size = 20, colour = "grey")
    p <- p + theme(axis.ticks.x = element_blank(), axis.text.x = element_blank(), axis.title.x=element_blank())
    p <- p + theme(axis.ticks.y = element_blank(), axis.text.y = element_blank(), axis.title.y=element_blank())
    p
}
shinyServer(功能(输入、输出、会话){
需要(ggplot2)

plotId发生这种情况的原因是shiny不会逐行执行服务器端代码。shiny在开始时执行所有非反应性代码一次。但是
renderPlot()
和其他反应性代码只会在必要时运行。(调用它们时)

结果是,它将5赋值,然后将6赋值给
i
,然后才渲染绘图

output[[id]] <- renderPlot ({
    print("section D")
    pw[[i]]})
控制台输出:

[1] "section A"
[1] "section C"
[1] "section E"
[1] "section B1"
[1] "section B2"
[1] "section B3"
[1] "section B4"
[1] "section D"
编辑: 至于
output[[id]]
id
在开始时会被计算,因此
output[[id]
会变成
output[[plot1]]
。但是
pw[[i]]
只有在shiny请求打印渲染时才会被计算,这是在该值设置为5然后设置为6之后

如果希望绘图1显示5,则可以在
renderPlot()
外部指定
id
,在
renderPlot()内部指定
i

id谢谢GyD,
从您的回答中,我得出结论,正常的for循环是不可能的。运行变量“I”将在renderPlot()外部而不是内部定义。 因此,我似乎必须至少对renderPlot()使用eval(parse())。 一个类似于for的循环:

for ( i in 1:4) {
        pltId <- paste ('plot', i, sep='')
        output[[pltId]] <- renderPlot ({pw[i]})
    }
for(1:4中的i){

pltId您的答案应该是可行的,但是您可以使用循环生成UI元素和服务器端(不知道您是否感兴趣)

我不太喜欢R中的
for
循环,所以我使用
lappy

library(shiny)
library(ggplot2)

# I want to plot these elements

vec <- c(5, 2, 3, 4)

# Defining some functions

initPlotWindows <- function () {
  pw          <- vector (mode = 'list', length = 6)                           # plot window data
  for (i in vec)  pw[[i]] <- p_empty (plotN = i)
  pw
}
p_empty <- function (plotN) {
  p <- ggplot()
  p <- p + annotate("text", label = plotN, x = .5, y = .5, size = 20, colour = "grey")
  p <- p + theme(axis.ticks.x = element_blank(), axis.text.x = element_blank(), axis.title.x=element_blank())
  p <- p + theme(axis.ticks.y = element_blank(), axis.text.y = element_blank(), axis.title.y=element_blank())
  p
}

# Creating pw list
pw <- initPlotWindows()

ui <- fluidPage(
  # Creating UI from loop
  lapply(vec, function(i) {
    column(6, plotOutput(paste0('plot', i), height = "180px"))
  })
)

server <- function(input, output, session){
  # Generating UI output from loop

  lapply(vec, function(i) {
    output[[paste0('plot', i)]] <- renderPlot({
      pw[[i]]
    })
  })
}

shinyApp(ui, server)
库(闪亮)
图书馆(GG2)
#我想画出这些元素
vec
for ( i in 1:4) {
        pltId <- paste ('plot', i, sep='')
        output[[pltId]] <- renderPlot ({pw[i]})
    }
for ( i in 1:4) {
        eval (parse (text = paste ("output[['plot", i, "']] <- renderPlot ({pw[", i, "]})", sep='')))
    }
library(shiny)
library(ggplot2)

# I want to plot these elements

vec <- c(5, 2, 3, 4)

# Defining some functions

initPlotWindows <- function () {
  pw          <- vector (mode = 'list', length = 6)                           # plot window data
  for (i in vec)  pw[[i]] <- p_empty (plotN = i)
  pw
}
p_empty <- function (plotN) {
  p <- ggplot()
  p <- p + annotate("text", label = plotN, x = .5, y = .5, size = 20, colour = "grey")
  p <- p + theme(axis.ticks.x = element_blank(), axis.text.x = element_blank(), axis.title.x=element_blank())
  p <- p + theme(axis.ticks.y = element_blank(), axis.text.y = element_blank(), axis.title.y=element_blank())
  p
}

# Creating pw list
pw <- initPlotWindows()

ui <- fluidPage(
  # Creating UI from loop
  lapply(vec, function(i) {
    column(6, plotOutput(paste0('plot', i), height = "180px"))
  })
)

server <- function(input, output, session){
  # Generating UI output from loop

  lapply(vec, function(i) {
    output[[paste0('plot', i)]] <- renderPlot({
      pw[[i]]
    })
  })
}

shinyApp(ui, server)