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