、これを試してください:あなたは、それが強調表示されているポイントを一度クリックした場合
アプローチ1を
library(shiny)
library(ggplot2)
# initialize global variable to record selected (clicked) rows
selected_points <- mtcars[0, ]
str(selected_points)
shinyApp(
ui = shinyUI(
plotOutput("plot", click = "clicked")
),
server = shinyServer(function(input, output) {
selected <- reactive({
# add clicked
selected_points <<- rbind(selected_points, nearPoints(mtcars, input$clicked))
# remove _all_ duplicates if any (toggle mode)
# http://stackoverflow.com/a/13763299/3817004
selected_points <<-
selected_points[!(duplicated(selected_points) |
duplicated(selected_points, fromLast = TRUE)), ]
str(selected_points)
return(selected_points)
})
output$plot <- renderPlot({
ggplot(mtcars, aes(x = mpg, y = wt)) +
geom_point() +
geom_point(data = selected(), colour = "red", size = 5)
})
})
)
(推奨)。それをもう一度クリックすると、ハイライトが再びオフになります(トグル)。
コードでは、グローバル変数selected_points
を使用して、実際にハイライトされた(選択された)ポイントと、ポイントがクリックされるたびにグローバル変数を更新する反応式selected()
を保存します。
str(selected_points)
は、作業をビジュアル化するのに役立ちますが、削除することができます。
アプローチ2(代替)
observe()
は、代わりのreactive()
及び参照グローバル変数selected_points
直接代わりに関数からオブジェクトを返すを使用して、わずかに異なるアプローチがある:もちろん
library(shiny)
library(ggplot2)
selected_points <- mtcars[0, ]
str(selected_points)
shinyApp(
ui = shinyUI(
plotOutput("plot", click = "clicked")
),
server = shinyServer(function(input, output) {
observe({
# add clicked
selected_points <<- rbind(selected_points, nearPoints(mtcars, input$clicked))
# remove _all_ duplicates (toggle)
# http://stackoverflow.com/a/13763299/3817004
selected_points <<-
selected_points[!(duplicated(selected_points) |
duplicated(selected_points, fromLast = TRUE)), ]
str(selected_points)
})
output$plot <- renderPlot({
# next statement is required for reactivity
input$clicked
ggplot(mtcars, aes(x = mpg, y = wt)) +
geom_point() +
geom_point(data = selected_points, colour = "red", size = 5)
})
})
)
リアクティブ関数selected()
を呼び出す代わりに、グローバル変数selected_points
をggplot
呼び出しで直接使用することができます。ただし、input$clicked
が変更されるたびにrenderPlot()
が実行されるようにする必要があります。したがって、renderPlot()
のコードには、input$clicked
へのダミー参照をコードに含める必要があります。
ここで、リアクティブ関数selected()
は不要になり、observe()
式で置き換えることができます。 reactive()
とは対照的に、observe()
は値を返しません。 input$clicked
が変更されるたびに、グローバル変数selected_points
が更新されます。
アプローチ3(無効な値)
このアプローチでは、グローバル変数が回避されます。代わりにreactiveValues
を使用して、リアクティブプログラミング(?reactiveValues
を参照)のための特別な機能を持つリスト様オブジェクトrv
を作成します。
library(shiny)
library(ggplot2)
shinyApp(
ui = shinyUI(
plotOutput("plot", click = "clicked")
),
server = shinyServer(function(input, output) {
rv <- reactiveValues(selected_points = mtcars[0, ])
observe({
# add clicked
rv$selected_points <- rbind(isolate(rv$selected_points),
nearPoints(mtcars, input$clicked))
# remove _all_ duplicates (toggle)
# http://stackoverflow.com/a/13763299/3817004
rv$selected_points <- isolate(
rv$selected_points[!(duplicated(rv$selected_points) |
duplicated(rv$selected_points, fromLast = TRUE)), ])
str(rv$selected_points)
})
output$plot <- renderPlot({
ggplot(mtcars, aes(x = mpg, y = wt)) +
geom_point() +
geom_point(data = rv$selected_points, colour = "red", size = 5)
})
})
)
は、
input$clicked
への変更のみが
observer
でコードの実行をトリガーすることを保証するために
isolate()
にカプセル化する必要が
rv
から
observer
パーツ参照であることに注意してください。それ以外の場合は、無限ループになります。無効値
rv
が変更されると、実行は
renderPlot
になります。
結論
は個人的には、依存性(反応性)がより明確する反応性官能基を使用したアプローチ1を好みます。アプローチ2でクリックされた$を入力するダミーコールは直感的ではありません。アプローチ3では、反応性の徹底的な理解と適切な場所でのisolate()
の使用が必要です。
ありがとうございます。最初はなぜ2番目の 'geom_point'レイヤーにデータソース' selected() 'があるのか理解できませんでしたが、' selected() '関数が' selected_points'オブジェクトを返すことが分かりました。興味のない、私はデータソースとして 'selected_points'を持っていて、関数からオブジェクトを返すことはできませんか?もしそうなら、なぜあなたは他のものよりもこのようにしますか? – roman
特定のデータが変更されたとき(反応性)、反応性に関するコードや実行されるコードはどれですか?はい、 'selected_points'を使うことができますが、' input $ clicked'にダミーの呼び出しを加えることで反応性を強制する必要があります(私の編集した回答の_Approach 2_を参照)。依存関係をより明示的にするリアクティブ関数を使用する方が好きです。 – Uwe
拡張回答ありがとう - 非常に役に立ちます。 – roman