我正在尝试创建一个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教程。