首页 > 解决方案 > 使用滑块输入值作为变量

问题描述

我是 Shiny 的新手,我仍在思考语法。我正在创建一个应用程序,我想在其中使用范围滑块的值来裁剪栅格。但是,我不知道如何将它集成到渲染函数之外。

例如,如果我有一个简单的 10x10 栅格,值从 1:100 开始,我想只保留滑块中的范围。使用设定的数字手动执行此操作,例如 20-40,我会运行类似:

r<-raster(ncol = 10, nrow = 10)
values(r) <- 1:ncell(r)
plot(r)
r[r <= 20] <- NA
r[r >=40] <- NA
plot(r)

但我似乎无法弄清楚如何将滑块变量集成到这种类型的设置中。我添加了 renderText 以确保我正确引用了这些值,但我无法弄清楚如何在渲染函数之外使用这些值。

ui <- fluidPage(
  sliderInput("range","range:", min = 1, max = 100, value = c(10,50)),
  plotOutput("original"),
  textOutput("range"),
  plotOutput("cropped")
  )

server<- function(input, output){
  r<-raster(ncol = 10, nrow = 10)
  values(r) <- 1:ncell(r)
  r2<-r
  reactive({r2[r2 <= input$range[1]] <- NA})
  reactive({r2[r2 >= input$range[2]] <- NA})
  output$original<- renderPlot(plot(r))
  output$cropped<- renderPlot(plot(r2))
  range <- reactive({cbind(input$range[1], input$range[2])})
  output$range<- renderText({range()})
}


shinyApp(ui = ui, server = server)

标签: rshiny

解决方案


要使您的变量 r 和 r2 监听滑块中的更改,您必须使其具有反应性:

library(raster)

ui <- fluidPage(
  sliderInput("range","range:", min = 1, max = 100, value = c(10,50)),
  plotOutput("original"),
  textOutput("range"),
  plotOutput("cropped")
)

server<- function(input, output){

  r <- reactive({
    localVar <- raster(ncol = 10, nrow = 10)
    values(localVar) <- 1:ncell(localVar)
    # return
    localVar
  })
  r2 <- reactive({
    localVar <- r()
    localVar[localVar <= input$range[1]] <- NA
    localVar[localVar >= input$range[2]] <- NA
    # return
    localVar
  })
  output$original<- renderPlot(plot(r()))
  output$cropped<- renderPlot(plot(r2()))
  range <- reactive({cbind(input$range[1], input$range[2])})
  output$range<- renderText({range()})
}


shinyApp(ui = ui, server = server)

推荐阅读