Передать вектор ввода пользователя в функцию, которая принимает строку - PullRequest
0 голосов
/ 02 мая 2018

У меня есть блестящее приложение, которое принимает пользовательский ввод: input$libraries - это реактивный символьный вектор, полученный пользователем из

output$libraries <- renderUI({
checkboxGroupInput(inputId = "libraries", 
                   label = strong("Select the libraries for which you would like to see part counts"), 
                   choiceValues = LibraryIDs$libraryid,
                   choiceNames = LibraryNames$name, 
                   selected = LibraryIDs$libraryid[1],
                   inline = T)}})
})

Я хотел бы выбрать из своей базы данных postgreSQL, у меня есть функция, настроенная так:

get_query <- function(querystring){
  # create a connection

  # loads the PostgreSQL driver
  drv <- dbDriver("PostgreSQL")
  con <- dbConnect(drv, dbname = "RosettaRelational",
                   host = "localhost", port = 5432,
                   user = "postgres", password = rstudioapi::askForPassword("Database password"))
  on.exit(dbDisconnect(con))

  # check for the existance of tables, must be created in pgAdmin4
  #dbExistsTable(con, "libraries")

  query <- eval(parse(text = querystring))
  return(query)
}

Он принимает строку и анализирует ее для оценки запроса

теперь, когда я пытаюсь запросить базу данных как таковую:

Names <- get_query(paste0("con %>% tbl('libraries') %>% 
filter(libraryid %in% input$libraries) %>% select(name) %>% collect()"))

Я получаю ошибку: объект 'input' не найден. Я знаю, что он неправильно анализирует вектор реактивных символов. Как я должен изменить это, чтобы заставить это работать?

Я пытался:

Names <- get_query(paste0("con %>% tbl('libraries') %>% 
filter(libraryid %in% '",input$libraries,"') %>% select(name) %>% collect()"))

но при этом выбирается только первая библиотека в векторе, даже когда пользователь выбирает несколько библиотек ... это работает, когда на входе $ используется только один символ, например, когда на входе вместо кнопки установлены флажки

В основном, мне нужно, чтобы input$libraries выглядел как c ('111a,' 111b ',' 211 ',' 311a '), когда он передается в строку, если пользователь выбирает 111a, 111b, 211 и 311a, вместо просто «111a», который он сейчас проходит.

1 Ответ

0 голосов
/ 03 мая 2018

По результатам некоторых испытаний на моей стороне ваш код

Names <- get_query(paste0("con %>% tbl('libraries') %>% filter(libraryid %in% '",input$libraries,"') %>% select(name) %>% collect()"))

будет "векторизовать" в своей текущей форме для нескольких библиотек в input$libraries. Это создаст отдельную строку для каждой библиотеки во входных $ библиотеки вместо одной строки, содержащей все библиотеки. например,

> Names
[1] "con %>% tbl('libraries') %>% filter(libraryid %in% '111a') %>% select(name) %>% collect()" 
[2] "con %>% tbl('libraries') %>% filter(libraryid %in% '111b') %>% select(name) %>% collect()"

Используя мои собственные данные и ваше предложение «чтобы input$libraries выглядело как c (« 111a »,« 111b »,« 211 »,« 311a »)« Я адаптировал ваш код к

Names <- get_query(paste0("con %>% tbl('libraries') %>% filter(libraryid %in% c(", paste0("'", input$libraries, "'", collapse = ", "), ")) %>% select(name) %>% collect()"))

Это должно дать вам требуемое значение c («111a», «111b», «211», «311a»).

Это не самое элегантное, но оно должно работать. Вы также можете сделать это внутреннее paste0() раньше, если оно выглядит грязным, как показано ниже

libraries_comma_separated <- paste0("'", input$libraries, "'", collapse = ", ")

Это даст вам «111a», «111b», «211», «311a», а затем наберите

Names <- get_query(paste0("con %>% tbl('libraries') %>% filter(libraryid %in% c(", libraries_comma_separated, ")) %>% select(name) %>% collect()"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...