2016-08-20 11 views
0

このシャイニーリーフレットアプリのサークルマーカーの半径をselectInput変数で駆動しようとしています。selectInputによって駆動されるリーフレットアプリの円の半径

ドロップダウンには、 "Week.1"、 "Week.2"、 "Week.3"の3つの値があり、これらの数値はすべて、質問。

selectInput("weekView", "Week's Revenue:", 
      c("1" = "Week.1", 
      "2" = "Week.2", 
      "3" = "Week.3")), 

私は現在Week.1をロードおよびthr結果を得るています。私は週を変更し、マップ上の対応する$と反応する入力を知っています。 スタティック~(Week.1)の代わりに$ weekViewを入力しようとすると、「Week.1」というエラーが表示されます。上のいずれかのアドバイスが最善の方法

leaflet(data = P) %>% 
    addTiles() %>% # Add default OpenStreetMap map tiles 
    addCircleMarkers(~Long, ~Lat, popup = ~Week.1, 
        radius = ~(Week.1)/40000, 
        stroke = FALSE, 
        fillOpacity = 0.5) 

を行くことができます...半径が計算される前に、私はそれらを削除する代わりに= Falseの引用符を使用してみましたが、私はそうする適切な場所を見つけることができませんよこれについて?私が言いたいのは radius = input$weekView/40000

あるすべてのスクリプト:DF = P

> head(P) 
    group  Lat  Long  Country Week.1 Week.2 Week.3 Week.4 
1 178.100 55.37805 -3.435973 United Kingdom 649,613 665,147 640,732 649,642 
2 174.890 51.16569 10.451526  Germany 117,766 120,402 104,167 91,157 
3 144.100 46.22764 2.213749   France 135,784 117,759 109,337 101,873 
4 174.211 52.13263 5.291266 Netherlands 403,950 397,438 377,855 389,345 
5 174.990 40.46367 -3.749220   Spain 94,472 95,742 88,313 86,400 
6 178.600 56.26392 9.501785  Denmark 70,094 72,487 67,597 66,769 

感謝の

library(shiny) 
library(leaflet) 

ui <- fluidPage(

    selectInput("weekView", "Week's Revenue:", 
       c("1" = "Week.1", 
       "2" = "Week.2", 
       "3" = "Week.3")), 

    leafletOutput("mymap"), 
    p() 
) 

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


    output$mymap <- renderLeaflet({ 

    x <- input$weekView 

    P<- read.csv("Lebara_weeks_rev4.csv") 

    as.numeric(P$Long) 
    as.numeric(P$Lat) 
    as.character(P$Week.1) 

    P$Week.1 <- as.numeric(gsub(",","",P$Week.1)) 
    P$Week.2 <- as.numeric(gsub(",","",P$Week.2)) 
    P$Week.3 <- as.numeric(gsub(",","",P$Week.3)) 

    long <- P$Long 
    Lat <- P$Lat 

    leaflet(data = P) %>% 
     addTiles() %>% # Add default OpenStreetMap map tiles 
     addCircleMarkers(~Long, ~Lat, popup = ~Week.1, 
         radius = ~(Week.1)/40000, 
         stroke = FALSE, 
         fillOpacity = 0.5) 
    }) 
} 

shinyApp(ui, server) 

ヘッド! ピート

IはtidyrとsubsetWeek1 <を用い - P [1:7、そしてそれらのサブセットの)半径値に対するそれらが十分に小さい作るsubsetWeek1$value/40000の変数を作りました。私は

library(tidyr) 
P <- tidyr::gather(P, week, value, Week.1:Week.3) 

subsetWeek1 <- P[1:7,] 
subsetWeek2 <- P[8:14,] 
subsetWeek3 <- P[15:21,] 

Week1val <- subsetWeek1$value 
Week2val <- subsetWeek2$value 
Week3val <- subsetWeek3$value 

これはselectInput値をピックアップし、マップを変更していないようだ... selectInput 1 = subsetWeek1 $値、2 = subsetWeek2 $値および3 = subsetWeek3 $価値を作ってみました。マップ上にマーカーはなく、エラーは表示されません。サークルのスケールが目に見えないようにすることはできますか?非アプリ版では問題ありません。

+1

あなたは[再現性]であるためにあなたの質問に十分なデータを追加する必要があります(http://stackoverflow.com/questions/5963269/how-to-make-a -great-r-reproducible-example)を使用します。 – alistaire

+0

@alistaireこれはどうですか?すべてのコード。 dfのサンプルとそれ以上の説明。 –

+1

もっと良いですが、すべてが第1週にハードコードされています。サーバー内で 'P'を簡単にサブセット化できるように、長い形式(例えば' tidyr :: gather(P、week、value、Week.1:week.4) ')選択された入力からの情報で機能します。サイドノート:サーバー機能の外部にデータをロードしてクリーンアップするので、一度だけ完了します。 – alistaire

答えて

1

あなたは終わっています。変数名を更新して少しだけクリーンアップする必要があります。一般的に、パラメータを少し変えて同じ行を繰り返す場合は、より良い方法があります。 gatherextract_numericためtidyrを使用してオプション、:

library(shiny) 
library(tidyr) 
library(leaflet) 

P <- read.csv("Lebara_weeks_rev4.csv") 

# do munging that won't change based on input here 
P2 <- gather(P, week, value, Week.1:Week.4) # gather to long form 
P2$value <- extract_numeric(P2$value) # convert to numeric 

ui <- fluidPage(
    selectInput("weekView", "Week's Revenue:", 
       c("1" = "Week.1", 
        "2" = "Week.2", 
        "3" = "Week.3", 
        "4" = "Week.4")), 

    leafletOutput("mymap") 
) 

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

    output$mymap <- renderLeaflet({ 
     # do munging dependent on input here 
     P3 <- P2[P2$week == input$weekView, ] # subset based on input 

     leaflet(data = P3) %>% 
      addTiles() %>% # Add default OpenStreetMap map tiles 
      addCircleMarkers(lng = ~Long, lat = ~Lat, 
          popup = ~format(value, big.mark = ','), # reinsert commas 
          radius = ~value/40000, 
          stroke = FALSE, 
          fillOpacity = 0.5) 
    }) 
} 

shinyApp(ui, server) 
+0

あなたは紳士で学者、仲間です!それは治療に効果があった。 –

+0

動的に変化する "値"を使って、どのように色を設定しますか?選択されている現在の値が以前の値よりも小さい場合、color = "red"、そうでなければ "green"です。例えば"week.2" <"week.1"の場合、addCircleMarkers(color = "red")。 week.1はいつも緑色に始まります。 –

+1

'fillColor =〜ifelse(value> c(0、value [-nrow(P2)]]' fillColor =〜ifelse(value> c(0、value [-nrow(P2)])は、 )、 'green'、 'red') 'ですが、それはdata.frameの場所に完全に基づいているため、1週間の値が不正確になります。もっと徹底的なオプションは、あなたの好きなグループ化手段を使って 'P2 'に色の列を追加することです。 baseの 'ave'、dplyrの' group_by'と 'mutate'、またはdata.tableの':= 'と' by'です。 – alistaire

関連する問題