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()))
Можете ли вы попробовать это?