在之后给出的答案这个问题 ,我可以得到一个多边形渲染与每点击一个情节:

用圆圈映射

但是,我似乎找不到允许polygon()持久化的简单方法。 我现在拥有它的方式,每次重新绘制初始绘图和注释。

什么是(a)解耦注释和绘图的正确方法,以便可以创建多个注释?

我觉得我可以使用“Paint Circle”按钮添加一个新的polygon() ,但我不知道如何在R中创建一个新的“对象”。

码:

server.R

library(shiny)
library(maps)
library(mapdata)
library(rworldmap)
library(gridExtra)

circleFun <- function(center = c(0,0),radius = 1, npoints = 100){
    tt <- seq(0,2*pi,length.out = npoints)
    xx <- center[1] + radius * cos(tt)
    yy <- center[2] + radius * sin(tt)
    return(data.frame(x = xx, y = yy))
}

shinyServer(function(input, output) {
  # Reactive dependencies
  buttonClicked <- reactive(input$paintupdate)

  isolate({
  theworld <- function() {
    myplot <- map("world2", wrap=TRUE, plot=TRUE,
        resolution=2)
  }})

  user.circle <- function() {
    if (buttonClicked() > 0) {
      cur.circ <- circleFun(c(input$plotclick$x,input$plotclick$y),
                            radius=input$radius*100, npoints = 30)
      polygon(x=cur.circ$x,y=cur.circ$y,
              col = rainbow(1000,s=0.5,alpha=0.5)[input$circlecolor])
    }
  }

  output$myworld <- renderPlot({
    theworld()
    user.circle()
  })

  output$clickcoord <- renderPrint({
    # get user clicks, report coords
    if ("plotclick" %in% names(input)) {
      print(input$plotclick)
    }
    print(buttonClicked())
  })



})

ui.R

library(shiny)

# Define UI for application
shinyUI(pageWithSidebar(

  # Application title
  headerPanel("App"),

  sidebarPanel(
    sliderInput("radius", 
                "Location radius", 
                min = 0,
                max = 1, 
                value = 0.1,
                round=FALSE,
                step=0.001),
    sliderInput("circlecolor",
                "Circle color (hue)",
                min=0,
                max=1000,
                step=1,
                value=sample(1:1000,1)),
    actionButton("paintupdate", "Paint Circle"),
    textOutput("clickcoord")
  ),

  mainPanel(
    tabsetPanel(
      tabPanel("Map",
               plotOutput("myworld", height="650px",width="750px",
                          clickId="plotclick")
      )
    )
  )
))

===============>>#1 票数:2 已采纳

您可以稍微更改示例并添加reactiveValue以使其工作

library(shiny)
library(maps)
library(mapdata)
library(rworldmap)
library(gridExtra)

circleFun <- function(center = c(0,0),radius = 1, npoints = 100){
  tt <- seq(0,2*pi,length.out = npoints)
  xx <- center[1] + radius * cos(tt)
  yy <- center[2] + radius * sin(tt)
  return(data.frame(x = xx, y = yy))
}

library(shiny)

# Define UI for application
runApp(
  list(ui = pageWithSidebar(

    # Application title
    headerPanel("App"),

    sidebarPanel(
      sliderInput("radius", 
                  "Location radius", 
                  min = 0,
                  max = 1, 
                  value = 0.1,
                  round=FALSE,
                  step=0.001),
      sliderInput("circlecolor",
                  "Circle color (hue)",
                  min=0,
                  max=1000,
                  step=1,
                  value=sample(1:1000,1)),
      actionButton("paintupdate", "Paint Circle"),
      textOutput("clickcoord")
    ),

    mainPanel(
      tabsetPanel(
        tabPanel("Map",
                 plotOutput("myworld", height="650px",width="750px",
                            clickId="plotclick")
        )
      )
    )
  ),
  server = function(input, output, session) {
    # Reactive dependencies
    myReact <- reactiveValues()
    buttonClicked <- reactive(input$paintupdate)

    isolate({
      theworld <- function() {
        myplot <- map("world2", wrap=TRUE, plot=TRUE,
                      resolution=2)
      }})


    user.circle <- function(a,b,c,d) {
      cur.circ <- circleFun(c(a,b),
                            radius=c, npoints = 30)
      polygon(x=cur.circ$x,y=cur.circ$y,
              col = rainbow(1000,s=0.5,alpha=0.5)[d])     
    }


    observe({
      if (buttonClicked() > 0) {
        # take a dependence on button clicked
        myReact$poly <- c(isolate(myReact$poly), list(list(a=isolate(input$plotclick$x), b= isolate(input$plotclick$y)
                                             ,c=isolate(input$radius*100), d = isolate(input$circlecolor))))
      }
    }, priority = 100)

    output$myworld <- renderPlot({
      theworld()
        for(i in seq_along(myReact$poly)){
          do.call(user.circle, myReact$poly[[i]])
        }
    })

    output$clickcoord <- renderPrint({
      # get user clicks, report coords
      if ("plotclick" %in% names(input)) {
        print(input$plotclick)
      }
      print(buttonClicked())
    })



  }), display.mode= "showcase"
)

多聚的例子

  ask by bright-star translate from so

未解决问题?本站智能推荐:

1回复

如何使用库“ rworldmap”在Shiny R上绘制地图

虽然我可以将我的数据与Markdown上的rworldmap一起使用来生成漂亮的地图,但无法使用Shiny R来实现相同的地图。请提供帮助。 我的代码段:
1回复

闪亮的updateSelectInput不显示值,下拉菜单为空白

我根据侧面板中“选择区域”的先前输入字段,为国家绘图创建了第二个输入“选择国家”字段。 我使用指定数据表的“国家”列作为通过updateSelectInput选择每个“区域”(也是列)后将出现的名称。 由于某种原因,它可以在我创建的一个名为“性别”的标签中使用,该标签的格式完全相同,
1回复

任何人都可以建议一个良好的世界地图可视化用于闪亮?

对不起,请提前填写文本墙。 我正在创建一种新型的等值区域图,其中各国基于不同的分类变量进行着色。 我设置应用程序的方式,我根据每个国家/地区的每个基础变量的级别为每个国家分配RGB值,我希望地图显示RGB值 - 看起来很简单,对吧? 不幸的是,大多数地图可视化似乎都想为我做颜色选择,而
1回复

Beside = F在R的子图中的barplot中不起作用

我正在尝试通过此页上的代码制作堆叠的barplot: 在地图上绘制的条 但是下面包含next = FALSE的代码仍然绘制并排的条形图,而不是堆叠的条形图。 可能是什么原因,我该如何解决?
2回复

在R中创建地图就像rworldmap的方式一样,但对于具有省份的特定国家/地区

我将rworldmap包与rworldmap Data一起使用,我喜欢它。 我想为伊朗绘制地图,并提供与每个省相关的数据。 这样做的步骤是什么? 我知道我们可以在一些像美国这样的国家中绘制像R这样的地图,而不是所有国家。
1回复

使用R或Python绘制世界地图,将简单列表中的国家/地区设为彩色

我有国家列表: 当我尝试用R绘制它时: 我得到: 我做错了,还是有更简单的方法绘制世界地图? 以及如何绘制所有其他未着色或已着色的颜色?
1回复

使用模块使用闪亮的输入创建任意数量的图

非常感谢您的时间和帮助! 我的目标:在光泽中创建任意数量的绘图( ggplot2 ),每个绘图都带有多个控件(y轴最小/最大值,绘图下载按钮,绘图,绘图的悬停信息)。 重要提示 :请使用闪亮的模块实现该模块 ,在该模块中创建一个模块以构建单个ui元素,另一个模块调用该单个元素模块并循环以
1回复

R闪亮:在使用绘图单击以在条件面板中返回值之前隐藏NA

我正在使用plot_click询问Shiny中的图形,并希望条件面板显示2位信息。 但是此刻,条件面板显示“ NA”,直到我执行绘图单击,如何使它消失? 在UI中的conditionalPanel中,我尝试了!is.na(output.nametext) , output.namete
1回复

记住“闪亮”中的绘图上的选定点

我正在尝试创建一个交互式的k均值图,使人们可以看到输入的效果(例如指定中心而不是纯粹的随机选择),但是遇到了我的Shiny代码问题。 我正在尝试了解如何选择一个点并使我的应用程序记住该点以用作中心。 我一直在寻找一种使用响应式代码执行此操作的方法,但是到目前为止,我尝试过的所有操作都失败了。
1回复

闪亮应用程序中的绘图上的工具提示

我想为绘图上的x轴和y轴添加一个工具提示。 这是我的代码: 我如何创建像这样的工具提示: 或像这些之一: 谢谢。