3

マップベースのヒートマップをブラウザーにマウントし、ヒートマップに表示される変数を変更できる光沢のあるアプリを開発しようとしています。マップは、GIS シェープ ファイルを含む地理的領域のものであり、選択された変数がヒート マップとしてマップ上に表示されます。残念ながら、変数がggplot()正しく渡されず、マップが失敗するという問題があります。以下の server.r コードはストレートな R スクリプトとして問題なく正常に実行されますが、Shiny に適合させると失敗します。

この問題はggplot()、server.r の次のコードで発生します。

myplot1 <- myplot1 + aes(long, lat, group = group, fill = input$var) + ...

エラーが発生します:

eval(expr、envir、enclos)のエラー:オブジェクト「入力」が見つかりません

これは、 がui.r から渡されていることをfill = input$var認識していないことに関係しています。は、ヒート マップに表示するために ui.r で選択された変数 (var1、var2 など) です。これは、認識されないコードで私が知っている唯一のインスタンスです。この行の前に使用しましたが、目的の変数の名前が明確に保持されています。(例)でハードコーディングすると、正常に動作し、マップが正しく表示されます。input$varinput$varinput$varprint(str(input$var))fill=var1ggplot()

私も使用environment = environment()しましたggplot()が、これは別のエラーを生成します:

エラー: 連続スケールに離散値が指定されました

変数で記述されたデータ フレームを探しているが、代わりに単一の値を取得することを意味すると解釈しています。

欠けている単純なもの、つまり宣言または再割り当てする必要があるものだと感じます。これに関する洞察、ガイダンス、またはフィードバックをいただければ幸いです。どうもありがとう !!

# server.R

library(shiny)

library(maps)
library(mapdata)
library(sp)
library(maptools)
library(scales)
library(RColorBrewer)
library(ggplot2)
library(rgeos)
library(plyr)
library(reshape)
library(mapproj)
library(rgdal)
library(grid)
library(gridExtra)

setwd("C:/Shiny")


# Step 1 Read/loading the target shapefile
gregion = readOGR(dsn="C:/Shiny", layer="duid")

# Step 2 Get row numbers from .dbf / explicitly identifies attribute rows by the .dbf offset.
gregion@data$id = rownames(gregion@data)

# Step 3 Makes centroid (point layer) from polygon "FORTIFY"
gregion.points = fortify(gregion, region="id")

# Step 4 Reading in .csv which will be joined to .dbf using "MERGE"
mydata <- read.csv("c:/Shiny/dataset.txt")

# Step 5 Joins the points to their corresponding attributes and finalizes the data preparation 
gregion.df = join(gregion.points, gregion@data, by="id")

# Step 6 Merge makes an inner join of the shapefile's data frame and the .csv on a common item (usually the spatial key)
mygeomdata <- merge(gregion.df, mydata, by.x="UID", by.y="UID")


# Define server logic required to plot various variables as heatmap
# Step 7 Create map
shinyServer(function(input, output) {

  # Compute the forumla text in a reactive expression since it is 
  # shared by the output$caption and output$mapPlot expressions

  formulaText <- reactive({
    paste("Variable:", input$var)
  })

  # Return the formula text for printing as a caption
  output$caption <- renderText({
    formulaText()
  })


  output$mapPlot <- renderPlot({

    myplot1 <- ggplot(mygeomdata)
    myplot1 <- myplot1 + aes(long, lat, group = group, fill = input$var) + labs(x = "Easting", y = "Northing") + scale_fill_gradient(low = "ghostwhite", high = "steelblue")
    myplot1 <- myplot1 + geom_polygon()
    myplot1 <- myplot1 + coord_equal()

    print(myplot1)

  })

})

#ui.R

library(shiny)

shinyUI(pageWithSidebar(

  # Application title
  headerPanel("Mapping"),

  # Sidebar with controls to select the variable to plot
  #

  sidebarPanel(
    selectInput("var", "Variable:",
                list("Variable 1" = "var1",
                     "Variable 2" = "var2"))
  ),

  # Show the caption and plot of the requested variable

  mainPanel(
    h3(textOutput("caption")),

    plotOutput("mapPlot")
  )
))

データセットのサンプルmydata <- read.csv("c:/Shiny/dataset.txt")は次のとおりです。

UID var1    var2    var3    var4    var5    var6    var7
1   0   0.001   0   0   0   0   0
2   0   0   0   0   1   0   0
3   0   0   0   0   0   0   0
4   0   0   0   0   1   0   0
5   0   0   0   0   1   0   0
6   0   0   0   0   1   0   0
7   0   0   0   0   0   0   0
8   0   0.004   0.026   0   0   0   0
9   0.499   0.014   0   0.499   1   0   0.033
10  0.573   0.002   0.015   0.573   1   0   0.427
11  1   0.003   0.01    1   1   0   0

mygeomdata次の構造があります。

 $ UID       : int  1 1 1 1 1 1 1 1 1 1 ...
 $ long      : num  393121 392895 392895 392840 392839 ...
 $ lat       : num  5501404 5502275 5502275 5502489 5502494 ...
 $ order     : int  1 2 3 4 5 6 7 8 9 10 ...
 $ hole      : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ piece     : Factor w/ 4 levels "1","2","3","4": 1 1 1 1 1 1 1 1 1 1 ...
 $ group     : Factor w/ 5693 levels "0.1","1.1","10.1",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ id        : chr  "0" "0" "0" "0" ...
 $ DUID      : Factor w/ 5656 levels "130023362","130023367",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ PC        : Factor w/ 3617 levels "0","ZZZ0A3","ZZZ0A4",..: 3271 3271 3271 3271 3271 3271 3271 3271 3271 3271 ...
 $ DUIDAREA  : num  21687 21687 21687 21687 21687 ...
 $ ELEV      : num  14.8 14.8 14.8 14.8 14.8 ...
 $ GroupUp   : int  2 2 2 2 2 2 2 2 2 2 ...
 $ GroupUpT  : Factor w/ 2 levels "A","B": 2 2 2 2 2 2 2 2 2 2 ...
 $ var1      : num  0 0 0 0 0 0 0 0 0 0 ...
 $ var2      : num  0.001 0.001 0.001 0.001 0.001 0.001 0.001 0.001 0.001 0.001 ...
 $ var3      : num  0 0 0 0 0 0 0 0 0 0 ...
 $ var4      : num  0 0 0 0 0 0 0 0 0 0 ...
 $ var5      : int  0 0 0 0 0 0 0 0 0 0 ...
 $ var6      : num  0 0 0 0 0 0 0 0 0 0 ...
 $ var7      : num  0 0 0 0 0 0 0 0 0 0 ...
4

4 に答える 4

2

Shiny への移植の一環としてこのエラーが発生していますが、これはggplot. 一言で言えば、ローカル変数と関数引数を使用してaesいて、最初に思ったよりもトリッキーです。

完全な議論といくつかの良いオプションについては、この SO の質問を参照してください。

心に留めておくべきことの1つは、ggplotの場合、必要なものすべてをデータフレームの一部として保持する限り、はるかに簡単になります.

この質問に対するagstudyの回答は、何が起こっているのかを説明しています。

それが役立つことを願っています。

于 2013-10-23T17:56:22.543 に答える
2

ありがとう、ラム・ナラシンハン。あなたは私にいくつかの非常に役立つ投稿を指摘してくれました. 変更されたセクションは次のとおりです。

environment<-environment() 
  myplot1 <- ggplot(mygeomdata, aes(long, lat, group = group, fill = get(input$var)), environment = environment) 

上記のコードは renderPlot 呼び出しの外に配置されます。どうもありがとう !

于 2013-10-25T00:40:02.730 に答える
1

実は、もっと簡単な解決策があります。前と同じように renderPlot() 関数内で ggplot() を使用しますが、aes() の代わりに aes_string() を使用します。

output$mapPlot <- renderPlot({
    ggplot(mygeomdata, aes_string(x=long, y=lat, group = group, fill = input$var)) + geom_point()
})
于 2015-01-06T17:06:14.907 に答える