【问题标题】:How to subset a dataframe and plot with leaflet depending on inputselect in shiny如何根据闪亮中的输入选择对数据框进行子集化并使用传单进行绘图
【发布时间】:2016-10-01 05:20:13
【问题描述】:

我正在尝试使用 Rstudio 制作一个闪亮的应用程序来生成传单输出。请注意,shiny 是我以前从未使用过的包,因此脚本中可能存在其他错误而不是我目前遇到的错误。

我正在使用一个数据框,其中包含不同个体的轨迹,我想从中子集化并绘制一只动物的轨迹以响应输入选择。

Sample:

WhaleID     lat       long
gm08_150c   68,4276   16,5192
gm08_150c   68,4337   16,5263
gm08_150c   68,4327   16,5198
gm08_154d   68,4295   16,5243
gm08_154d   68,4313   16,5314
gm08_154d   68,4281   16,5191

输入选择中的选项是 .csv 文件中使用的确切名称,在列 WhaleID 中,因此我希望从主数据框中将所有行与 WhaleID 子集。

在这个子集之后,我只想从先前的子集数据帧中对“long”和“lat”列进行子集化。然后传单读取此数据帧。

最后一步是在地图上绘制这些“长”和“纬”位置。

很遗憾,我不断收到错误消息:

Warning: Error in $: object of type 'closure' is not subsettable
Stack trace (innermost first):
    82: inherits
    81: resolveFormula
    80: derivePolygons
    79: addPolylines
    78: function_list[[i]]
    77: freduce
    76: _fseq
    75: eval
    74: eval
    73: withVisible
    72: %>%
    71: func [#15]
    70: output$map
     4: <Anonymous>
     3: do.call
     2: print.shiny.appobj
     1: <Promise>

我正在使用的脚本:

    require(shiny)
    require(leaflet)

    ##Main dataframe I want to subset depending on inputselection    
    dataframe <-read.csv2("PW_with_speedbearingturn.csv") 


    ui <- bootstrapPage( 
      tags$style(type = "text/css", "html, body {width:100%;height:100%}"),
      absolutePanel(top = 10, right = 10,
      selectInput(inputId = "whaleID", 
                  label = "Select a whale", 
                  choices = c("gm08_150c","gm08_154d"))),
      leafletOutput(outputId = "map", width = "100%", height = "700")
    ) 

    server <- function(input, output, session){ 

      #?observeEvent  
      #observeEvent(input$whaleID, )
      Start <- makeIcon(
        iconUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/f/fe/Dark_Green_Arrow_Down.svg/480px-Dark_Green_Arrow_Down.svg.png",
        iconWidth = 22, iconHeight = 20,
        iconAnchorX = 11, iconAnchorY = 20)

      eventReactive(input$whaleID,{
                    df<-subset(dataframe, WhaleID == "input$whaleID") ## "input$whaleID" should become the WhaleID that is selected from the inputselect.

                    df<-subset(df, select = c("long", "lat")) 
      })                
      output$map <- renderLeaflet({
      leaflet() %>%
      addTiles() %>%
      addPolylines(df, lng = df$long, lat = df$lat, col = "grey", opacity = 1)%>%
      addMarkers(df, lng = first(df$long), lat = first(df$lat), icon = Start, popup = "Start")
      })
    } 

    shinyApp(ui = ui, server = server)

我认为这与 eventreactive 部分和其中的子集部分有关。每次都必须更新它以响应从输入选择中选择的选项。不幸的是,我找不到这个问题的任何现有解决方案。

关于如何解决这个问题的任何建议?

提前致谢,

安诺

【问题讨论】:

  • 每个whaleID都有一层会有帮助吗?如果有,您有多少个个人 ID?

标签: r dataframe shiny leaflet subset


【解决方案1】:

我认为您可以完全避免使用eventReactive,因为renderLeaflet 将对input 的更改做出反应。这是一个改编的例子,因为我没有你的数据。让我知道它是否没有意义。

require(shiny)
require(leaflet)

##Main dataframe I want to subset depending on inputselection    
dataframe <- data.frame(
  abb = state.abb,
  x = state.center$x,
  y = state.center$y,
  stringsAsFactors = FALSE
)


ui <- bootstrapPage( 
  tags$style(type = "text/css", "html, body {width:100%;height:100%}"),
  absolutePanel(top = 10, right = 10,
                selectInput(inputId = "whaleID", 
                            label = "Select a state", 
                            choices = dataframe[["abb"]])),
  leafletOutput(outputId = "map", width = "100%", height = "700")
)

server <- function(input, output, session){ 

  Start <- makeIcon(
    iconUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/f/fe/Dark_Green_Arrow_Down.svg/480px-Dark_Green_Arrow_Down.svg.png",
    iconWidth = 22, iconHeight = 20,
    iconAnchorX = 11, iconAnchorY = 20)


  output$map <- renderLeaflet({
    df <- subset(dataframe, abb == input$whaleID)
    leaflet() %>%
      addTiles() %>%
      #addPolylines(df, lng = df$long, lat = df$lat, col = "grey", opacity = 1)%>%
      addMarkers(data = df, lng = ~x, lat = ~y, icon = Start, popup = "Start")
  })
} 

shinyApp(ui = ui, server = server)

【讨论】:

  • 非常感谢您的回复,它帮助我解决了问题,脚本现在可以正常工作。
【解决方案2】:

有点晚了,但为了完整起见并说明如何使用 eventReactive 来做到这一点。 您必须为其分配一个名称,然后调用 eventReactive (df()),否则它永远不会运行。

此外,如果您将input$whaleID 放在括号中,它会将"input$whaleID" 的数据框列子集化,我认为它不在数据框中。因此,您希望它不带括号,因此它从 selectInput 中获取选定的参数。

您也可以将图标放在服务器之外,因为它不必是反应式的。

require(shiny)
require(leaflet)
require(dplyr)

##Main dataframe I want to subset depending on inputselection    
dataframe <- read.csv2("PW_with_speedbearingturn.csv")

Start <- makeIcon(
  iconUrl = "https://upload.wikimedia.org/wikipedia/commons/thumb/f/fe/Dark_Green_Arrow_Down.svg/480px-Dark_Green_Arrow_Down.svg.png",
  iconWidth = 22, iconHeight = 20,
  iconAnchorX = 11, iconAnchorY = 20)

ui <- bootstrapPage( 
  tags$style(type = "text/css", "html, body {width:100%;height:100%}"),
  absolutePanel(top = 10, right = 10,
                selectInput(inputId = "whaleID", 
                            label = "Select a whale", 
                            choices = c("gm08_150c","gm08_154d"))),
  leafletOutput(outputId = "map", width = "100%", height = "700")
)

server <- function(input, output, session){ 

  df <- eventReactive(input$whaleID,{
    daf <- subset(dataframe, WhaleID == input$whaleID) 
    subset(daf, select = c("long", "lat")) 
  })  

  output$map <- renderLeaflet({
    leaflet() %>%
      addTiles() %>%
      addPolylines( lng = df()$long, lat = df()$lat, col = "red", opacity = 1)%>%
      addMarkers( lng = first(df()$long), lat = first(df()$lat), icon = Start, 
                  popup = "Start")
  })
} 

shinyApp(ui = ui, server = server)

【讨论】:

    猜你喜欢
    • 2019-10-03
    • 1970-01-01
    • 2021-04-17
    • 1970-01-01
    • 2013-08-15
    • 2017-06-07
    • 1970-01-01
    • 1970-01-01
    • 2020-11-28
    相关资源
    最近更新 更多