ОШИБКА: невозможно привести тип 'environment' к вектору типа 'character' с помощью ggplot - PullRequest
0 голосов
/ 23 ноября 2018

Я пытаюсь использовать код ggplot, найденный в SO.Проблема в том, что я продолжаю получать ошибки, и я думаю, что это как-то связано с попыткой передать функции через shinydashboard.Я пробовал все виды вещей.Я могу заставить это хорошо отрисовываться в консоли, но не в shinydashboard.

 library(shinydashboard)
 library(shiny)
 library(ggplot2)
 library(dplyr)

 ui <- fluidPage(
   gggauge(52,breaks=c(0,35,70,100)
 )

 )
 server <- function(input, output) {
   gggauge <- function(pos,breaks=c(0,30,70,100)) {
     get.poly <- function(a,b,r1=0.5,r2=1.0) {
       th.start <- pi*(1-a/100)
       th.end <- pi*(1-b/100)
       th <- seq(th.start,th.end,length=100)
       x <- c(r1*cos(th),rev(r2*cos(th)))
       y <- c(r1*sin(th),rev(r2*sin(th)))
       return(data.frame(x,y))
     }
     ggplot()+ 
      geom_polygon(data=get.poly(breaks[1],breaks[2]),aes(x,y),fill="red")+
      geom_polygon(data=get.poly(breaks[2],breaks[3]),aes(x,y),fill="gold")+geom_polygon(data=get.poly(breaks[3],breaks[4]),aes(x,y),fill="forestgreen")+
      geom_polygon(data=get.poly(pos-1,pos+1,0.2),aes(x,y))+
      geom_text(data=as.data.frame(breaks), size=5, fontface="bold", vjust=0,
        aes(x=1.1*cos(pi*(1-breaks/100)),y=1.1*sin(pi*(1-breaks/100)),label=paste0(breaks,"%")))+
      annotate("text",x=0,y=0,label=pos,vjust=0,size=8,fontface="bold")+
      coord_fixed()+
      theme_bw()+
      theme(axis.text=element_blank(),
        axis.title=element_blank(),
        axis.ticks=element_blank(),
        panel.grid=element_blank(),
        panel.border=element_blank()) 
   }
 }
 shinyApp(ui = ui, server = server)

1 Ответ

0 голосов
/ 23 ноября 2018

Использование -

library(shinydashboard)
library(shiny)
library(ggplot2)
library(dplyr)

gggauge <- function(pos,breaks=c(0,30,70,100)) {
  get.poly <- function(a,b,r1=0.5,r2=1.0) {
    th.start <- pi*(1-a/100)
    th.end <- pi*(1-b/100)
    th <- seq(th.start,th.end,length=100)
    x <- c(r1*cos(th),rev(r2*cos(th)))
    y <- c(r1*sin(th),rev(r2*sin(th)))
    return(data.frame(x,y))
  }
  ggplot()+ 
    geom_polygon(data=get.poly(breaks[1],breaks[2]),aes(x,y),fill="red")+
    geom_polygon(data=get.poly(breaks[2],breaks[3]),aes(x,y),fill="gold")+geom_polygon(data=get.poly(breaks[3],breaks[4]),aes(x,y),fill="forestgreen")+
    geom_polygon(data=get.poly(pos-1,pos+1,0.2),aes(x,y))+
    geom_text(data=as.data.frame(breaks), size=5, fontface="bold", vjust=0,
              aes(x=1.1*cos(pi*(1-breaks/100)),y=1.1*sin(pi*(1-breaks/100)),label=paste0(breaks,"%")))+
    annotate("text",x=0,y=0,label=pos,vjust=0,size=8,fontface="bold")+
    coord_fixed()+
    theme_bw()+
    theme(axis.text=element_blank(),
          axis.title=element_blank(),
          axis.ticks=element_blank(),
          panel.grid=element_blank(),
          panel.border=element_blank()) 
}

ui <- fluidPage(

  plotOutput("plot1", click = "plot_click"),
  verbatimTextOutput("info")

)

server <- function(input, output) {

  output$plot1 <- renderPlot({
    #plot(mtcars$wt, mtcars$mpg)
    gggauge(52,breaks=c(0,35,70,100))
  })
}
shinyApp(ui = ui, server = server)

Вывод

enter image description here

Пояснение

Вы перепутали несколько вещей, но вы были почти там.Все, что вам нужно, прямо здесь.Вам просто нужно организовать.Давайте рассмотрим компоненты -

  1. gggauge - это функция, которая отображает график, поэтому она должна быть функцией, определенной отдельно, и , называемой из серверного компонента.Простого определения его в объекте server было недостаточно.В вашем случае функция была определена, а не вызвана!
  2. Компонент ui нуждается в заполнителе для рендеринга графика.Непосредственная попытка визуализировать сюжет в ui не обрезает его.Вам просто нужен объект plotOutput, который действует как заполнитель (компонент пользовательского интерфейса)
  3. Теперь, когда о (1) и (2) позаботились, пришло время визуализировать график в serverобъект, вызывая функцию gggauge.

Хоп, который помогает!

...