单击R中的交互式绘图
我试着用一堆盒子来创建一个图,然后当一个盒子被点击时,它就会被涂上颜色。我有两个问题。1.我想不出一种方法,当我单击时,图形可以动态更新。2.我不知道如何存储来自click输入变量的值,这样我就可以存储所有以前的单击,并且可以在多个框中着色。你可以看到我试图解决和测试这两个问题中的任何一个的一些方法,但我没有任何运气。任何一个问题的帮助都将不胜感激单击R中的交互式绘图,r,shiny,R,Shiny,我试着用一堆盒子来创建一个图,然后当一个盒子被点击时,它就会被涂上颜色。我有两个问题。1.我想不出一种方法,当我单击时,图形可以动态更新。2.我不知道如何存储来自click输入变量的值,这样我就可以存储所有以前的单击,并且可以在多个框中着色。你可以看到我试图解决和测试这两个问题中的任何一个的一些方法,但我没有任何运气。任何一个问题的帮助都将不胜感激 ui <- fluidPage( # Application title titlePanel("Boxes&q
ui <- fluidPage(
# Application title
titlePanel("Boxes"),
sidebarLayout(
sidebarPanel(
textOutput("text")),
# Get it it's a pun
mainPanel(
plotOutput("boxPlot",click = "test")
)
)
)
# Define server logic required to draw a histogram
server <- function(input, output) {
vals <- reactiveValues(x=NA,y=NA,test=NA)
observeEvent(input$click, {
vals$x <- c(vals$x,input$test$x)
vals$y <- c(vals$y,input$test$y)
vals$test <- input$test$x
})
output$boxPlot <- renderPlot({
par(mai=c(0,0,0,0))
plot(1,ylim=c(2,15),xlim=c(2,15),type='n',yaxs='i',xaxs='i',ylab='',xlab='',axes=F)
for (i in 2:15) {
abline(v=i)
abline(h=i)
}
observeEvent(input$click, { rect(floor(input$test$x),floor(input$test$y),ceiling(input$test$x),ceiling(input$test$y),col='blue')})
# if (length(vals$x) > 0) {
# rect(floor(vals$x[1]),floor(vals$y[1]),ceiling(vals$x[1]),ceiling(vals$y[1]),col='blue')
# }
})
# output$text <- renderText(vals$x[length(vals$x)])
output$text <- renderText(vals$test)
}
# Run the application
shinyApp(ui = ui, server = server)
ui这可能是一个简单的解决方案
对于单击事件,您应该只有一个observeEvent
。在该observeEvent
中,将您的x和y值存储为当前所做的reactiveValues
然后,renderPlot
应根据reactiveValues
绘制网格线并填充矩形。通过在renderPlot
中包含input$boxPlot\u单击
(正如我所说),每次单击都会重新绘制绘图
library(shiny)
ui <- fluidPage(
titlePanel("Boxes"),
sidebarLayout(
sidebarPanel(
textOutput("text")),
mainPanel(
plotOutput("boxPlot", click = "boxPlot_click")
)
)
)
server <- function(input, output) {
vals <- reactiveValues(x=NA,y=NA)
observeEvent(input$boxPlot_click, {
vals$x <- c(vals$x,input$boxPlot_click$x)
vals$y <- c(vals$y,input$boxPlot_click$y)
})
output$boxPlot <- renderPlot({
input$boxPlot_click
par(mai=c(0,0,0,0))
plot(1,ylim=c(2,15),xlim=c(2,15),type='n',yaxs='i',xaxs='i',ylab='',xlab='',axes=F)
for (i in 2:15) {
abline(v=i)
abline(h=i)
}
for (i in seq_along(length(vals$x))) {
rect(floor(vals$x),floor(vals$y),ceiling(vals$x),ceiling(vals$y),col='blue')
}
})
output$text <- renderText(paste0(vals$x, ', ' , vals$y, '\n'))
}
shinyApp(ui = ui, server = server)
库(闪亮)
ui这可能是一个简单的解决方案
对于单击事件,您应该只有一个observeEvent
。在该observeEvent
中,将您的x和y值存储为当前所做的reactiveValues
然后,renderPlot
应根据reactiveValues
绘制网格线并填充矩形。通过在renderPlot
中包含input$boxPlot\u单击
(正如我所说),每次单击都会重新绘制绘图
library(shiny)
ui <- fluidPage(
titlePanel("Boxes"),
sidebarLayout(
sidebarPanel(
textOutput("text")),
mainPanel(
plotOutput("boxPlot", click = "boxPlot_click")
)
)
)
server <- function(input, output) {
vals <- reactiveValues(x=NA,y=NA)
observeEvent(input$boxPlot_click, {
vals$x <- c(vals$x,input$boxPlot_click$x)
vals$y <- c(vals$y,input$boxPlot_click$y)
})
output$boxPlot <- renderPlot({
input$boxPlot_click
par(mai=c(0,0,0,0))
plot(1,ylim=c(2,15),xlim=c(2,15),type='n',yaxs='i',xaxs='i',ylab='',xlab='',axes=F)
for (i in 2:15) {
abline(v=i)
abline(h=i)
}
for (i in seq_along(length(vals$x))) {
rect(floor(vals$x),floor(vals$y),ceiling(vals$x),ceiling(vals$y),col='blue')
}
})
output$text <- renderText(paste0(vals$x, ', ' , vals$y, '\n'))
}
shinyApp(ui = ui, server = server)
库(闪亮)
用户界面