r блестящая ошибка Ошибка в as.vector(x, "символ"): невозможно принудительно привести тип "замыкание" к вектору типа "символ"

При попытке передать введенный пользователем ввод (empId) из Shiny UI в запрос sql на глянцевой server.r не уверен, как отладить эту ошибку.

 Error in as.vector(x, "character") : 
 cannot coerce type 'closure' to vector of type 'character'

UI.r

library(shiny)

shinyUI(fluidPage(
titlePanel("Employee Table (AdventureWorks)"),
sidebarLayout(
sidebarPanel((""),
             textInput("idnumb", "Employee ID number",""),
             submitButton("Ok")),
             mainPanel(tableOutput("emptitle")))))

Server.r

 shinyServer(function(input, output) {
 library(RODBC)
 library(sqldf)
 a1 = reactive({ (input$idnumb) })
 acc_con1 = odbcConnect("AdvWrk", uid="... ", pwd="... ")
 sql1 = sqlQuery(acc_con1, paste0('select Title from dbo.Employee where EmployeeID=',a1))
 output$emptitle = renderTable(print(sql1))
 })

Чтобы проверить, работает ли мой запрос, я устал от фактического EmployeeID в sql, как показано ниже

  .
  .
  sql1 = sqlQuery(acc_con1, paste0('select Title from dbo.Employee where EmployeeID = 8'))
  .
  .

Я получаю нормальный выход,

  Title
  Production Technician - WC10 

Когда я пытаюсь сделать это реагирующим на ввод данных пользователем, я вижу ошибку в as.vector(x, "символ"): не удается принудительно привести тип "замыкание" к вектору типа "символ"... ошибка... Нужна помощь.

2 ответа

Решение

Основная проблема в вашем коде состоит в том, что вы даете реактивную функцию "a1" в качестве аргумента sqlQuery функция. sqlQuery ожидает, что вы дадите символ в качестве аргумента.

В этом случае, когда вы хотите отслеживать любые изменения в вводе. Вы могли бы использовать observe функция. Я также добавил строку проверки ошибок, чтобы убедиться, что у вас есть какое-то значение в input$idnumb

shinyServer(function(input, output) {
         library(RODBC)
         library(sqldf)
            observe({
            if(input$idnumb ==NULL)
               return(NULL)
            acc_con1 = odbcConnect("AdvWrk", uid="... ", pwd="... ")
            sql1 = sqlQuery(acc_con1, paste0('select Title from dbo.Employee where EmployeeID=',input$idnumb))
            )}
        output$emptitle = renderTable(print(sql1))
 )}

Я также согласен с @Mikael Jumppanen, что

Основная проблема в вашем коде состоит в том, что вы даете реактивную функцию "a1" в качестве аргумента функции sqlQuery. sqlQuery ожидает, что вы дадите символ в качестве аргумента.

Однако решение намного проще: вы должны просто вызвать a1() вместо a1, поскольку вы определили его как реактивную функцию.

 sql1 = sqlQuery(acc_con1, paste0('select Title from dbo.Employee where EmployeeID=',a1()))

Можете ли вы попробовать это?

Другие вопросы по тегам