gpt4 book ai didi

r - Shiny - FILL 值未在 Shiny 服务器中正确传递给 ggplot - 未找到错误对象 'input'

转载 作者:行者123 更新时间:2023-12-04 10:12:55 24 4
gpt4 key购买 nike

我正在尝试开发一个 Shiny 的应用程序,它将在浏览器上安装基于 map 的热图,并允许您更改热图上显示的变量。该 map 是具有 GIS 形状文件的地理区域,然后所选变量作为热图显示在 map 上。不幸的是,我有一个问题,即变量没有传递给 ggplot()正确,我的 map 失败了。下面的 server.r 代码作为一个直接的 R 脚本成功运行没有问题,但是当适应 Shiny 时它失败了。

以下 ggplot() 会出现问题server.r 中的代码:

myplot1 <- myplot1 + aes(long, lat, group = group, fill = input$var) + ...

我得到一个错误:

Error in eval(expr, envir, enclos) : object 'input' not found

这与 fill = input$var 有关它无法识别 input$var 的地方这是从 ui.r. 传递过来的。 input$var是 ui.r 中要显示在热图上的选定变量(var1、var2 等)。这是我在代码中知道的唯一实例 input$var不被认可。我用过print(str(input$var))在此行之前,它清楚地包含所需变量的名称。如果我硬编码它(例如 fill=var1 ),那么 ggplot()工作正常, map 显示正确。

我也用过environment = environment()ggplot()但这会产生另一个错误:

Error : Discrete value supplied to continuous scale

我的意思是它正在寻找由变量描述的数据框,但它得到的是单个值。

我觉得我缺少的是一些简单的东西——我应该声明或重新分配的东西。如果人们对此有任何见解、指导或反馈,我将不胜感激。非常感谢!!

# server.R

library(shiny)

library(maps)
library(mapdata)
library(sp)
library(maptools)
library(scales)
library(RColorBrewer)
library(ggplot2)
library(rgeos)
library(plyr)
library(reshape)
library(mapproj)
library(rgdal)
library(grid)
library(gridExtra)

setwd("C:/Shiny")


# Step 1 Read/loading the target shapefile
gregion = readOGR(dsn="C:/Shiny", layer="duid")

# Step 2 Get row numbers from .dbf / explicitly identifies attribute rows by the .dbf offset.
gregion@data$id = rownames(gregion@data)

# Step 3 Makes centroid (point layer) from polygon "FORTIFY"
gregion.points = fortify(gregion, region="id")

# Step 4 Reading in .csv which will be joined to .dbf using "MERGE"
mydata <- read.csv("c:/Shiny/dataset.txt")

# Step 5 Joins the points to their corresponding attributes and finalizes the data preparation
gregion.df = join(gregion.points, gregion@data, by="id")

# Step 6 Merge makes an inner join of the shapefile's data frame and the .csv on a common item (usually the spatial key)
mygeomdata <- merge(gregion.df, mydata, by.x="UID", by.y="UID")


# Define server logic required to plot various variables as heatmap
# Step 7 Create map
shinyServer(function(input, output) {

# Compute the forumla text in a reactive expression since it is
# shared by the output$caption and output$mapPlot expressions

formulaText <- reactive({
paste("Variable:", input$var)
})

# Return the formula text for printing as a caption
output$caption <- renderText({
formulaText()
})


output$mapPlot <- renderPlot({

myplot1 <- ggplot(mygeomdata)
myplot1 <- myplot1 + aes(long, lat, group = group, fill = input$var) + labs(x = "Easting", y = "Northing") + scale_fill_gradient(low = "ghostwhite", high = "steelblue")
myplot1 <- myplot1 + geom_polygon()
myplot1 <- myplot1 + coord_equal()

print(myplot1)

})

})

#ui.R

library(shiny)

shinyUI(pageWithSidebar(

# Application title
headerPanel("Mapping"),

# Sidebar with controls to select the variable to plot
#

sidebarPanel(
selectInput("var", "Variable:",
list("Variable 1" = "var1",
"Variable 2" = "var2"))
),

# Show the caption and plot of the requested variable

mainPanel(
h3(textOutput("caption")),

plotOutput("mapPlot")
)
))

数据集样本,mydata <- read.csv("c:/Shiny/dataset.txt")是:

UID var1    var2    var3    var4    var5    var6    var7
1 0 0.001 0 0 0 0 0
2 0 0 0 0 1 0 0
3 0 0 0 0 0 0 0
4 0 0 0 0 1 0 0
5 0 0 0 0 1 0 0
6 0 0 0 0 1 0 0
7 0 0 0 0 0 0 0
8 0 0.004 0.026 0 0 0 0
9 0.499 0.014 0 0.499 1 0 0.033
10 0.573 0.002 0.015 0.573 1 0 0.427
11 1 0.003 0.01 1 1 0 0

mygeomdata具有以下结构:

 $ UID       : int  1 1 1 1 1 1 1 1 1 1 ...
$ long : num 393121 392895 392895 392840 392839 ...
$ lat : num 5501404 5502275 5502275 5502489 5502494 ...
$ order : int 1 2 3 4 5 6 7 8 9 10 ...
$ hole : logi FALSE FALSE FALSE FALSE FALSE FALSE ...
$ piece : Factor w/ 4 levels "1","2","3","4": 1 1 1 1 1 1 1 1 1 1 ...
$ group : Factor w/ 5693 levels "0.1","1.1","10.1",..: 1 1 1 1 1 1 1 1 1 1 ...
$ id : chr "0" "0" "0" "0" ...
$ DUID : Factor w/ 5656 levels "130023362","130023367",..: 1 1 1 1 1 1 1 1 1 1 ...
$ PC : Factor w/ 3617 levels "0","ZZZ0A3","ZZZ0A4",..: 3271 3271 3271 3271 3271 3271 3271 3271 3271 3271 ...
$ DUIDAREA : num 21687 21687 21687 21687 21687 ...
$ ELEV : num 14.8 14.8 14.8 14.8 14.8 ...
$ GroupUp : int 2 2 2 2 2 2 2 2 2 2 ...
$ GroupUpT : Factor w/ 2 levels "A","B": 2 2 2 2 2 2 2 2 2 2 ...
$ var1 : num 0 0 0 0 0 0 0 0 0 0 ...
$ var2 : num 0.001 0.001 0.001 0.001 0.001 0.001 0.001 0.001 0.001 0.001 ...
$ var3 : num 0 0 0 0 0 0 0 0 0 0 ...
$ var4 : num 0 0 0 0 0 0 0 0 0 0 ...
$ var5 : int 0 0 0 0 0 0 0 0 0 0 ...
$ var6 : num 0 0 0 0 0 0 0 0 0 0 ...
$ var7 : num 0 0 0 0 0 0 0 0 0 0 ...

最佳答案

即使您在尝试将其移植到 Shiny 时收到此错误,但这与 ggplot 相关。简而言之,您正在使用 aes 的局部变量和函数参数,这比乍看起来要棘手。

请参阅this SO question进行全面讨论和几个不错的选择。

要记住的一件事:对于 ggplot,如果您将所需的一切都保留为数据框的一部分,您会发现它要容易得多。

agstudy's response in this question解释发生了什么。

希望对您有所帮助。

关于r - Shiny - FILL 值未在 Shiny 服务器中正确传递给 ggplot - 未找到错误对象 'input',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19531729/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com