在R中进行for循环,其中迭代次数是UI输入的反应变量

  • 本文关键字:UI 变量 迭代 for 循环 r shiny reactive
  • 更新时间 :
  • 英文 :


我正在尝试创建一个ShinyApp,其中Mandelbrot集显示为图像。我想展示的是,迭代次数越多,图像的清晰度就越高。因此,我放置了一个滑块输入,以便增加或减少迭代次数。

当我尝试用n <- input$iteraciones替换n <- 10

我得到以下错误:

Warning: 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.)
61: stop
60: .getReactiveEnvironment()$currentContext
59: getCurrentContext
55: .subset2(x, "impl")$get
54: $.reactivevalues
52: server [#11]

这是我的完整脚本:

ui <- fluidPage(

# Image
plotOutput('mandelbrot'),

# Slider iteraciones
sliderInput('iteraciones','iteraciones',min=1,max=50,value=5)
)

server <- function(input, output){

#Mandelbrot Set
a <- seq(-2,2,0.003) #Componente real
b <- seq(-1.5,1.5,0.003) #Componente imaginario
c <- outer(a,b*1i, FUN="+") #matriz numeros complejos

z <- matrix(0.0, nrow=length(a), ncol=length(b)) 
k <- matrix(0.0, nrow=length(a), ncol=length(b))

n <- input$iteraciones 

for (rep in 1:n) { 
for (i in 1:length(a)) { 
for (j in 1:length(b)) { 
if(Mod(z[i,j]) < 2 && k[i,j] < n) {
z[i,j] <- z[i,j]^2 + c[i,j]
k[i,j] <- k[i,j] + 1
}
}
}
}

# Mandelbrot Image
output$mandelbrot <- renderPlot({image(a,b,k)})

}

shinyApp(ui = ui, server = server)

我感谢所有对我的代码的更正,提前表示感谢。

服务器函数中的代码实际上只运行一次。如果您希望代码运行以响应输入,那么它需要是被动的。以下是如何更改代码

server <- function(input, output){

#Mandelbrot Set
mbset <- reactive({
a <- seq(-2,2,0.003) #Componente real
b <- seq(-1.5,1.5,0.003) #Componente imaginario
c <- outer(a,b*1i, FUN="+") #matriz numeros complejos

z <- matrix(0.0, nrow=length(a), ncol=length(b)) 
k <- matrix(0.0, nrow=length(a), ncol=length(b))

n <- input$iteraciones 

for (rep in 1:n) { 
for (i in 1:length(a)) { 
for (j in 1:length(b)) { 
if(Mod(z[i,j]) < 2 && k[i,j] < n) {
z[i,j] <- z[i,j]^2 + c[i,j]
k[i,j] <- k[i,j] + 1
}
}
}
}
image(a,b,k)
})

# Mandelbrot Image
output$mandelbrot <- renderPlot(mbset())
}

这是Shiny的核心理念。如果你是Shiny的新手,请查看2016年Shiny开发者大会的Reactive教程。

最新更新