Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 闪亮的应用程序与ggplot地图-多边形颜色不';不匹配用户输入_R_Ggplot2_Shiny - Fatal编程技术网

R 闪亮的应用程序与ggplot地图-多边形颜色不';不匹配用户输入

R 闪亮的应用程序与ggplot地图-多边形颜色不';不匹配用户输入,r,ggplot2,shiny,R,Ggplot2,Shiny,我正在尝试用Shiny和ggplot2构建一个简单的地图应用程序。其工作原理如下: 用户选择一个国家 该应用程序加载一个形状文件,并提供adm1国家/地区的输入字段列表 用户为每个区域输入一个数值(字段最初用随机值填充) 输入字段中的所有值都收集在一个向量中,合并到地图数据中,并作为ggplot()函数的fill参数提供 问题是ggplot似乎无法正确解释每个区域的输入值。另外,当通过UI修改输入值时,地图上的颜色不会改变。我认为馈送到fill参数的指示器向量没有正确解释/传递 谢谢你的建议

我正在尝试用Shiny和ggplot2构建一个简单的地图应用程序。其工作原理如下:

  • 用户选择一个国家
  • 该应用程序加载一个形状文件,并提供adm1国家/地区的输入字段列表
  • 用户为每个区域输入一个数值(字段最初用随机值填充)
  • 输入字段中的所有值都收集在一个向量中,合并到地图数据中,并作为
    ggplot()函数的
    fill
    参数提供
问题是ggplot似乎无法正确解释每个区域的输入值。另外,当通过UI修改输入值时,地图上的颜色不会改变。我认为馈送到
fill
参数的
指示器
向量没有正确解释/传递

谢谢你的建议

注:在下面的代码中,形状文件来源于加州大学戴维斯分校网站,用于再现性。我通常把它们放在本地

ui.R

shinyUI(fluidPage(
sidebarLayout(

 sidebarPanel(      
  selectInput("ctry", "Country:",
              list("Burkina Faso"="BFA","Ethiopia"="ETH","Ghana"="GHA",
                   "Kenya"="KEN","Malawi"="MWI","Mali"="MLI"), selected="ETH"), 
  uiOutput("sliders")

 ),   
 mainPanel(
   plotOutput('map', width = "100%")
 )
)
)
)
x<-c("ggplot2","sp","maptools","rgdal","rgeos","scales","grid","gridExtra","plyr") 
lapply(x, require, character.only=T)
rm(x)

shinyServer(function(input, output, session) { 

 gadm<-reactive ({
 load(paste0("http://biogeo.ucdavis.edu/data/gadm2/R/",input$ctry,"_adm1.RData")) #load country shapefile
 gadm@data$id <- rownames(gadm@data)
 gadm.df      <- fortify(gadm)
 gadm.df      <- join(gadm.df,gadm@data, by="id")
 return(gadm.df)
 })

 output$sliders <- renderUI({
   regions    <- unique(gadm()$NAME_1)  #get list of region names
   numRegions <- length(regions)        #get number of regions
   lapply(1:numRegions, function(i) {   #generate 1 input field per region
   numericInput(paste0("reg",i),        #with random values
               label = regions[i], value = round(runif(1, 1.0, 7.5),2),
               step=0.1) })
 })

 mapdata<- reactive({
   regions    <- unique(gadm()$NAME_1)  #get list of region names
   numRegions <- length(regions)        #get number of regions
   indicator  <- input$reg1             #initate vector with first value of user inputs
   for (i in 2:numRegions)(
   indicator<-c(indicator,eval(paste0("input$reg",i)))  #collect all user inputs values in a vector
   )
   indicator <- as.data.frame(t(rbind(indicator,regions)))#attribute region name to user input values
   colnames(indicator)<-c("indicator","NAME_1")
   merge(gadm(), indicator, by="NAME_1")                  #merge it with map data
   })

   themap <- function() {    
     ggplot() + geom_polygon(data=mapdata(), 
                        aes(x=long, y=lat, group=group, fill=as.numeric(indicator) )) + 
     scale_fill_gradient("test",low="#99d8c9", high="#00441b") +
     geom_path(data=mapdata(), 
            aes(x=long, y=lat, group=group), color='grey', size=0.15, alpha=0.6) + 
     coord_map()
   }

   output$map<-renderPlot({  themap()  }, height = 700 )

})
server.R

shinyUI(fluidPage(
sidebarLayout(

 sidebarPanel(      
  selectInput("ctry", "Country:",
              list("Burkina Faso"="BFA","Ethiopia"="ETH","Ghana"="GHA",
                   "Kenya"="KEN","Malawi"="MWI","Mali"="MLI"), selected="ETH"), 
  uiOutput("sliders")

 ),   
 mainPanel(
   plotOutput('map', width = "100%")
 )
)
)
)
x<-c("ggplot2","sp","maptools","rgdal","rgeos","scales","grid","gridExtra","plyr") 
lapply(x, require, character.only=T)
rm(x)

shinyServer(function(input, output, session) { 

 gadm<-reactive ({
 load(paste0("http://biogeo.ucdavis.edu/data/gadm2/R/",input$ctry,"_adm1.RData")) #load country shapefile
 gadm@data$id <- rownames(gadm@data)
 gadm.df      <- fortify(gadm)
 gadm.df      <- join(gadm.df,gadm@data, by="id")
 return(gadm.df)
 })

 output$sliders <- renderUI({
   regions    <- unique(gadm()$NAME_1)  #get list of region names
   numRegions <- length(regions)        #get number of regions
   lapply(1:numRegions, function(i) {   #generate 1 input field per region
   numericInput(paste0("reg",i),        #with random values
               label = regions[i], value = round(runif(1, 1.0, 7.5),2),
               step=0.1) })
 })

 mapdata<- reactive({
   regions    <- unique(gadm()$NAME_1)  #get list of region names
   numRegions <- length(regions)        #get number of regions
   indicator  <- input$reg1             #initate vector with first value of user inputs
   for (i in 2:numRegions)(
   indicator<-c(indicator,eval(paste0("input$reg",i)))  #collect all user inputs values in a vector
   )
   indicator <- as.data.frame(t(rbind(indicator,regions)))#attribute region name to user input values
   colnames(indicator)<-c("indicator","NAME_1")
   merge(gadm(), indicator, by="NAME_1")                  #merge it with map data
   })

   themap <- function() {    
     ggplot() + geom_polygon(data=mapdata(), 
                        aes(x=long, y=lat, group=group, fill=as.numeric(indicator) )) + 
     scale_fill_gradient("test",low="#99d8c9", high="#00441b") +
     geom_path(data=mapdata(), 
            aes(x=long, y=lat, group=group), color='grey', size=0.15, alpha=0.6) + 
     coord_map()
   }

   output$map<-renderPlot({  themap()  }, height = 700 )

})

x问题在于表达式
eval(paste0(“input$reg”,i))
返回的不是input$regN的内容,而是字符串“input$regN”。您可以使用双括号获得所需的输入元素:

x<-c("ggplot2","sp","maptools","rgdal","rgeos","scales","grid","gridExtra","plyr") 
lapply(x, require, character.only=T)
rm(x)

shinyServer(function(input, output, session) { 

 gadm<-reactive ({
 load(paste0(input$ctry,"_adm1.RData")) #load country shapefile
 gadm@data$id <- rownames(gadm@data)
 gadm.df      <- fortify(gadm)
 gadm.df      <- join(gadm.df,gadm@data, by="id")
 return(gadm.df)
 })

 output$sliders <- renderUI({
   regions    <- unique(gadm()$NAME_1)  #get list of region names
   numRegions <- length(regions)        #get number of regions
   lapply(1:numRegions, function(i) {   #generate 1 input field per region
   numericInput(paste0("reg",i),        #with random values
               label = regions[i], value = round(runif(1, 1.0, 7.5),2),
               step=0.1) })
 })

 mapdata<- reactive({
   regions    <- unique(gadm()$NAME_1)  #get list of region names
   numRegions <- length(regions)        #get number of regions

   indicator  <- sapply(seq_along(regions),function(i) input[[paste0('reg',i)]])
   if (any(is.null(unlist(indicator)))) return()
   indicator <- as.data.frame(cbind(indicator,regions))#attribute region name to user input values

   colnames(indicator)<-c("indicator","NAME_1")
   merge(gadm(), indicator, by="NAME_1")                  #merge it with map data
   })

   themap <- function() {    
     d <- mapdata()
     if (is.null(d)) return()
     ggplot() + geom_polygon(data=d, 
                        aes(x=long, y=lat, group=group, fill=as.numeric(indicator) )) + 
     scale_fill_gradient("test",low="#99d8c9", high="#00441b") +
     geom_path(data=d, 
            aes(x=long, y=lat, group=group), color='grey', size=0.15, alpha=0.6) + 
     coord_map()
   }

   output$map<-renderPlot({  themap()  }, height = 700 )

})

x非常感谢@Marat Talipov找到这个解决方案!