2016-12-07 6 views
0

selectizeInputで表示する2番目の変数を選択しているときにカーブの再設定を防止したいと思います。たとえば、下のコードでは、selectizeInputのデータセットをcyl(6)と選択し、曲線から1つのポイントを除外して、cyl(4)の第2の値を選択します。前回のカーブはcyl = 6でリセットされ、リセットされます(除外されたポイントは再びと表示されます)。Ggplot:plot - interaction - exclude - >除外ポイントのリセットを防止する

この現象を防止する方法はありますか?第2変数を選択する際に除外ポイントは「除外」のままですか?

例コード:

library(ggplot2) 
library(shiny) 

ui <- fluidPage(
    fluidRow(
    column(width = 6, 
      plotOutput("plot1", height = 350, 
         click = "plot1_click"), 
      selectizeInput("valuecyl", "Select value of cyl:", choices=unique(mtcars$cyl), multiple = TRUE)) 
) 
) 

server <- function(input, output) { 
    # For storing which rows have been excluded 

    vals <- reactiveValues() 
    data_df <- reactive({ 
    data <- mtcars 
    data <- data[data$cyl %in% input$valuecyl, ] 
    vals$keeprows = rep(TRUE, nrow(data)) 
    data 
    }) 

    output$plot1 <- renderPlot({ 
    data<- data_df() 
    keep <- data[ vals$keeprows, , drop = FALSE] 
    exclude <- data[!vals$keeprows, , drop = FALSE] 
    print(keep) 

    ggplot(keep, aes(wt,mpg,colour=as.factor(cyl))) + geom_point(data=keep) + geom_line(data=keep) + 
     geom_point(data = exclude, shape = 21, fill = NA, color = "black", alpha = 0.25) 
    }) 

    # Toggle points that are clicked 
    observeEvent(input$plot1_click, { 
    data <- data_df() 
    res <- nearPoints(data, input$plot1_click, allRows = TRUE) 

    vals$keeprows <- xor(vals$keeprows, res$selected_) 
    }) 


} 

shinyApp(ui, server) 

答えて

1

問題ここでは、あなたがvals$keeprowsを上書きし、rep(TRUE, nrow(data))でユーザーがselectizeで値を選択するたびに、それを交換することです。

ユーザーが保持していた行を保持し、余分な選択から新しい行を追加することによって、keeprows変数を更新する必要があります。

、私は少しあなたのコードを修正することを実行します。

#added the data in the reactiveValues for convenience 
    vals <- reactiveValues(keeprows=logical(0),data=mtcars[0,]) 

    #this observes the input and updates the data when the user adds a cyl value 
    observeEvent(input$valuecyl,{ 
    #get the id (here rownames) of the points excluded by the user 
    excluded_ids <- rownames(vals$data)[!vals$keeprows] 

    #make the new data 
    vals$data=mtcars[mtcars$cyl %in% input$valuecyl,] 

    #keep the rows that the user had not previously excluded. 
    vals$keeprows = !(rownames(vals$data) %in% excluded_ids) 
    }) 

私はreactiveValuesにデータを追加し、data_dfを取り除いているので、あなたはこれが機能するために、あなたのコード内でvals$datadata_df()を交換する必要があります。

+0

素晴らしい!ありがとう、それは完璧に動作します! –

+0

反応性のあるデータセット(この場合は 'mtcars()')を受け取ったとき、データセットを 'observeEvent'の内部で反応させておくことができますか? –

+0

あなたのアプリの別の部分から反応性のあるデータセットを取得した場合、 'observeEvent'は反応的な環境であるため、' vals $ data = dataset()[dataset()$ cyl%in%input $ valuecyl、] '。また、 'reactiveValues'の初期値を更新する必要があります。 – NicE

関連する問題