长期潜伏,第一次海报。
我正在尝试整合一个简单的Shiny应用程序,允许用户选择一个物种(使用一个图标),并在Map上显示物种的分布范围。到目前为止,我主要在预处理的图标框架中使用Shiny,这很容易,但物种的空间范围很大,很复杂,因此存储在PostgreSQL数据库中。
无论是直接在控制台还是在Shiny脚本中,我都没有与数据库连接的问题。即连接存在,我可以访问表并使用例如dbGETQuery dbGetQuery(con, "SELECT * FROM range WHERE sp_id = 664")
或st_read st_read(con, query = "SELECT * FROM range WHERE sp_id = 580")
。结果与预期一致。
这个问题似乎是在尝试将用户输入(物种选择)输入到PostgreSQL DB的SQL查询中时出现的。这无疑是一件简单的事情,但我无法找出我做错了什么。
这是我最终得到的错误:* 警告:错误:未能准备查询:错误:语法错误在或附近“{”行1:SELECT * FROM范围WHERE sp_id = {input$species_choice} *
系统似乎不喜欢使用'{}'括号,但据我所知,这似乎是一个合法的符号(如图所示,例如:text,这是一个我可以模拟的例子,没有问题,花括号和所有。
全球
library(shiny)
#library(glue)
library(DBI)
library(RPostgres)
library(RPostgreSQL)
library(sf)
library(dplyr)
library(ggplot2)
library(ozmaps)
con <- dbConnect(
RPostgres::Postgres(),
dbname = "db",
host = "localhost",
port = 5432,
password = "password",
user = "username")
species_list <- data.frame(sp_id = as.integer(c(580,581)),
taxon_name = c("Species1","Species2")) ## example short list to populate dropdown
*
字符串
- UI部分:**
ui <- fluidPage(
# Application title
titlePanel("Range Layers"),
# Sidebar with a slider input for number of bins
sidebarLayout(
sidebarPanel(
selectizeInput(inputId = 'species_choice', 'Select species or start typing', choices = c("Choose Species" = "",species_list$sp_id), selected = NULL, multiple = FALSE,
options = NULL),
),
# Show a plot of the distribution layer at continental scale
mainPanel(
plotOutput("distPlot")
)
)
)
型
服务器段:
server <- function(input, output, session) {
data <- reactive({
req(input$species_choice)
# Get the data
species <- st_read(con, query = "SELECT * FROM range WHERE sp_id = {input$species_choice}")
species
})
output$distPlot <- renderPlot({ggplot(data()) +
geom_sf(ozmap_states,mapping = aes()) +
geom_sf(mapping = aes(fill = taxon_id_r)) +
ggtitle(species$taxon_name)
})
shinyApp(ui = ui, server = server)
的字符串
毫无疑问,这个答案是我忽略的愚蠢的东西,但它目前正在把我逼上绝路。任何和所有的见解非常感谢!
1条答案
按热度按时间ekqde3dh1#
好吧,再看一下这个,解决方案,正如预期的那样,非常简单。与dbGetQuery不同,st_read似乎对SQL语句的构造方式更敏感。
下面的代码解决了这个问题,简单地使用粘贴来复制字符串的第一部分(SQL),然后是用户输入引用:
data <- reactive({ req(input$species_choice) st_read(con, query = paste(" SELECT * FROM range WHERE sp_id = ",input$species_choice)
。很容易,一旦你弄清楚了:-D