R 图形中的动态绘图高度
我有一个闪亮的应用程序,其中绘图需要根据用户输入调整高度。基本上,绘图可以有一个、两个或四个子绘图。当有一个或两个时,一切都很好,但有四个时,子地块会被挤压到太小的尺寸。我曾尝试使用反应函数为我提供服务器的计算高度,但出现以下错误:R 图形中的动态绘图高度,r,shiny,R,Shiny,我有一个闪亮的应用程序,其中绘图需要根据用户输入调整高度。基本上,绘图可以有一个、两个或四个子绘图。当有一个或两个时,一切都很好,但有四个时,子地块会被挤压到太小的尺寸。我曾尝试使用反应函数为我提供服务器的计算高度,但出现以下错误: Error in .getReactiveEnvironment()$currentContext() : Operation not allowed without an active reactive context. (You tried to do s
Error in .getReactiveEnvironment()$currentContext() :
Operation not allowed without an active reactive context. (You tried to do something that can only be done from inside a reactive expression or observer.)
下面是我尝试做的一个非常简化的版本:
library(shiny)
ui <- fluidPage(
fluidRow(
column(2,
radioButtons( inputId = 'plotcount', label = 'Plot Count',
choices = c('1' = 1,
'2' = 2,
'4' = 4
),
selected = '1'
)
),
column(10,
plotOutput( outputId = 'plots' )
)
)
)
server <- function(input, output) {
PlotHeight = reactive(
return( 500+250*(floor(input$plotcount/4)))
)
output$plots = renderPlot(height = PlotHeight(), {
if( as.numeric(input$plotcount) == 0 ){
plot.new()
return()
}
print(c( floor(sqrt(as.numeric(input$plotcount))),
ceiling(sqrt(as.numeric(input$plotcount)))
))
opar = par( mfrow = c( floor(sqrt(as.numeric(input$plotcount))),
ceiling(sqrt(as.numeric(input$plotcount)))
)
)
for( i in 1:as.numeric(input$plotcount) ){
plot(1:100, 1:100, pch=19)
}
par(opar)
})
}
shinyApp(ui =ui, server = server)
库(闪亮)
ui使用renderUI
:
library(shiny)
ui <- fluidPage(
fluidRow(
column(
width = 2
, radioButtons(
inputId = 'plotcount'
, label = 'Plot Count'
, choices = as.character(1:4)
)
),
column(
width = 10
, uiOutput("plot.ui")
)
)
)
server <- function(input, output) {
plotCount <- reactive({
req(input$plotcount)
as.numeric(input$plotcount)
})
plotHeight <- reactive(350 * plotCount())
output$plots <- renderPlot({
req(plotCount())
if (plotCount() == 0){
plot.new()
return()
}
opar <- par(mfrow = c(plotCount(), 1L))
for (i in 1:plotCount()) {
plot(1:100, 1:100, pch = 19)
}
par(opar)
})
output$plot.ui <- renderUI({
plotOutput("plots", height = plotHeight())
})
}
shinyApp(ui = ui, server = server)
库(闪亮)
用户界面完美!!非常感谢。实际上,将height=PlotHeight()
替换为height=function()PlotHeight()
就足够了,这样您的示例就可以工作了。@Max,您能解释一下为什么/如何工作吗?@mihagazvoda,请参阅renderPlot的帮助页--他们提到您需要提供一个函数,以了解它的工作原理,请检查函数源-在那里您可以看到,如果函数以高度(或宽度)形式提供,那么它将在reactive()
包装器中执行。事实上,在查看源代码时,我意识到在这种情况下也可以提供height=PlotHeight
,而且它也可以工作(但似乎没有文档记录)