Я пытаюсь создать блестящее приложение, которое позволяет пользователям запрашивать данные. Пользователи должны предоставить список интересующих значений, которые используются для фильтрации данных, хранящихся в базе данных. К сожалению, перевод dplyr
не кажется самым эффективным / производительным решением, поэтому мне нужно создать строку и передать ее в базу данных через sql()
. Манипуляции со строками также являются грубым отказоустойчивым средством для обработки ошибок / разновидностей ввода. Следующий код иллюстрирует этот процесс построения строки и запроса данных:
library(tibble)
library(dplyr)
library(dbplyr)
library(shiny)
library(RSQLite)
library(DBI)
library(stringr)
# Create string variables to experiment
mtcars1 <- tibble::rownames_to_column(mtcars, var = "model") %>% # Create column based on row names
dplyr::mutate(carmaker = stringr::word(model, 1)) # Create column with first word of column with row names
# Establish example database
con <- DBI::dbConnect(RSQLite::SQLite(), path = ":memory:")
copy_to(con, mtcars1, "mtcars1", temporary = FALSE)
# Query example
# Input
string_input <- "Mazda, Merc"
# Prepare input string to be used in SQL
string_filter <- string_input %>%
base::gsub("[,]+", " ", .) %>% # remove commas
stringr::str_squish(.) %>% # remove multiple blanks
base::gsub(" ", ",", .) %>% # substitute blanks for commas
base::gsub("(\\w+)", "'\\1'", .) %>% # enclose words with single quotation marks
base::paste0("carmaker in (", ., ")") # create sql where statement
# Data query
data <- tbl(con, "mtcars1") %>%
filter(sql(string_filter)) %>%
show_query() %>%
collect()
Я бы хотел реализовать этот код в блестящем приложении:
# Shiny user interface
ui <- fluidPage(
textInput(inputId = "string_input", label = "Input", value = "", placeholder = "Enter list of car models without commas"),
actionButton(inputId = "go", label = "Go"),
textOutput(outputId = "string_output")
)
# Shiny server function
server <- function(input, output){
observeEvent(input$go, {
output$string_output <- reactive({input$string_input %>%
base::gsub("[,]+", " ", .) %>% # remove commas
stringr::str_squish(.) %>% # remove multiple blanks
base::gsub(" ", ",", .) %>% # substitute blanks for commas
base::gsub("(\\w+)", "'\\1'", .) %>% # enclose words with single quotation marks
base::paste0("carmaker in (", ., ")") # create sql where statement
})
})
}
# Launch shiny app
shinyApp(ui, server)
Приложение переходит к списку значений предоставленный пользователем в качестве ввода, преобразует его и показывает преобразованный список в качестве вывода.
Вот что я хочу сделать:
- Я хотел бы сохранить преобразованный string_input в дополнительном локальном объекте для дальнейшего использования в приложении, то есть я хочу передать string_input в запрос данных, аналогичный приведенному выше примеру без блеска.
- Я хотел бы скопировать результат запроса данных в глобальную среду
R
, чтобы я мог использовать его даже после закрытия приложения.
Что касается моего второго пункта: я читал, что можно использовать <-
и <<-
, но я не мог заставить его работать в реактивном контексте.