2013-10-26 6 views
2

대화 형 플로팅 반짝이 응용 프로그램에 재설정 버튼을 추가하고 싶습니다. 응용 프로그램은 다음과 같은 작업을 수행합니다 : 마우스가 클릭되면 마우스의 위치를 ​​캡처하고 그 위치에 빨간색 점을 그리고 파란색 선으로 이전 위치를 모두 연결합니다. 재설정 버튼을 누르면 모든 빨간색 점과 파란색 선을 제거하고 새로운 플로팅 프로세스를 시작해야합니다. 그러나 실제로 리셋 버튼을 클릭하면 마지막 빨간색 점이 여전히 플로팅 영역에 남아 있습니다. 나는 무엇이 잘못되었는지 확신하지 못한다. 도와 줘서 고마워.Rshiny 대화 형 플로팅에 재설정 버튼 넣기

추신 : 줄거리 마우스 이벤트를 제공 한 데 감사드립니다.

library(shiny) 
N = 30 # sample size 
x = sort(runif(N, 0, 10)); y = x + rnorm(N) 
xval=NULL 
yval=NULL 

shinyServer(function(input, output) { 
get.coords <- reactive({ 
    data.frame(x=input$coords$x, y=input$coords$y) 
}) 

actiontype <- reactiveValues() 
actiontype$lastAction <- 'draw' 

observe({ 
    if (input$reset != 0) 
     actiontype$lastAction <- 'reset' 
}) 
observe({ 
    if (input$closepolygon != 0) 
     actiontype$lastAction <- 'closepolygon' 
}) 

output$diagPlot = renderPlot({ 
    plot(x, y, xlim = range(x), ylim = range(y)) 
    grid() 

    if (identical(actiontype$lastAction, 'reset')) { 
     xval <<- NULL 
     yval <<- NULL 
     actiontype$lastAction <- 'draw' 

    } else if (identical(actiontype$lastAction, 'draw')){ 
     temp <- get.coords() 
     xval <<- c(xval,temp$x) 
     yval <<- c(yval,temp$y) 

     points(xval, yval, pch = 19, col = 'red', cex = 1.5) 
     for (i in 1:(length(xval)-1)) 
      lines(c(xval[i],xval[i+1]),c(yval[i],yval[i+1]),type="l",col="blue") 
     if(identical(actiontype$lastAction, 'closepolygon')) 
      lines(c(xval[1],xval[length(xval)]),c(yval[1],yval[length(yval)]),type="l",col="blue")   
    } 
}, width = 700, height = 600) 
}) 

을 그리고 ui.R

library(shiny) 

shinyUI(pageWithSidebar(

headerPanel('iPED: The interactive ChIP-PED analysis platform'), 

sidebarPanel(
    helpText("graph"), 
    actionButton('closepolygon', 'Close the Polygon'), 
    actionButton('reset', 'Reset') 
), 

mainPanel(
    plotOutput('diagPlot', clickId="coords", height="auto", width="100%") 
) 
)) 

답변

1

문제는 당신이 actiontype$lastAction 경우 테스트 할 때 즉시 그래서, 'draw'actiontype$lastAction을 설정하고 'reset' 있다는 것이다 다음과 같이

server.R입니다 else 부분에 temp이 작성되고 마지막으로 플롯됩니다. xvalyvalNULL으로 설정하더라도 input$coords은 이전 클릭에서 계속 존재합니다. 따라서 해결책은 "재설정"input$coords에 있어야합니다. 내가 생각했던 어떤

#server.R 
library(shiny) 
N = 30 
x = sort(runif(N, 0, 10)); y = x + rnorm(N) 
xval=NULL 
yval=NULL 
checker <- 1 #### CHANGE 

shinyServer(function(input, output) { 
get.coords <- reactive({ 
    data.frame(x=input$coords$x, y=input$coords$y) 
}) 

actiontype <- reactiveValues() 
actiontype$lastAction <- 'draw' 

observe({ 
    if (input$reset != 0) 
     actiontype$lastAction <- 'reset' 
}) 
observe({ 
    if (input$closepolygon != 0) 
     actiontype$lastAction <- 'closepolygon' 
}) 

output$diagPlot = renderPlot({ 
    plot(x, y, xlim = range(x), ylim = range(y)) 
    grid() 

    if (identical(actiontype$lastAction, 'reset')) { 
     xval <<- NULL 
     yval <<- NULL 
     checker <<- 0 ####CHANGE 
     actiontype$lastAction <- 'draw' 

    } else if (identical(actiontype$lastAction, 'draw')){ 
     temp <- get.coords() 
     xval <<- c(xval,temp$x) 
     yval <<- c(yval,temp$y) 

     ########### CHANGE... 
     if(identical(checker, 0)) 
     { 
      points(xval, yval, pch = 19, col = rgb(1,0,0,0), cex = 1.5) 
      xval <<- NULL 
      yval <<- NULL 
      checker <<- 1 
     }else 
     { 
      points(xval, yval, pch = 19, col = 'red', cex = 1.5) 
     } 
     ############# ...CHANGE 

     for (i in 1:(length(xval)-1)) 
      lines(c(xval[i],xval[i+1]),c(yval[i],yval[i+1]),type="l",col="blue") 
     if(identical(actiontype$lastAction, 'closepolygon')) 
     lines(c(xval[1],xval[length(xval)]),c(yval[1],yval[length(yval)]), 
       type="l",col="blue") 
    } 
}, width = 700, height = 600) 
}) 

실제로하는 것입니다 많은 다른 시도 후

는 (예 NULL 등에 input$coords 설정), 나는 (I 변경할 때마다 내가 코멘트와 함께 표시) 다음과 함께했다 마지막으로 저장된 input$coords을 플롯하고 투명도는 100 %로하고 이전 클릭의 input$coords을 삭제하십시오. checker의 역할은 1 또는 0 사이에서 변동되며 정확하게 수행됩니다.

더 쉽게 수행 할 수 있지만 지금은 더 명확한 방법을 생각할 수 없습니다.

+0

이것은 정말 도움이됩니다. 고마워. 나는 앱을 더 개발하는 중이 야. – jasoncolts

0

마지막 포인트가 사라지지 않는 이유는 클릭 한 번만 클릭하면 최신 클릭의 데이터로 바뀔 때까지 지속되기 때문입니다. 내가 아는 한이 기능은 수정할 수 없습니다. 그러나이 데이터를 처리하는 방법은 가능합니다.

실제로 clickID는 2가 아니라 3 개의 숫자 값을 Shiny 세션으로 보냅니다. x, y 및 고유 식별자 double. 나는 그 해결책이 실제로 세 번째 식별자를 잘 활용하는 데 있다고 생각했다. reactactiveValue 객체에 저장되어있는 "reactive $ uniqueIdentifier"라는 식별자와이 식별자를 사용하여 두 번째 reactiveValue 객체 만 업데이트하자. 새 clickID의 식별자가 이전과 다르면 clickID 좌표와 함께 "reactive $ clickedCoordinates"라고하자. . 그런 다음 반응 형 $ clickedCoordinates를 내가 음모를 꾸미고 자하는 점의 좌표로 사용했습니다. 그런 다음 클릭 된 좌표를 재설정하고 모든 것을 비 원형으로 표시하고 싶을 때 간단히 reactive $ clickedCoordinates의 값을 NULL로 설정합니다. 이것으로 모든 점들이 사라졌습니다! :-)