r 闪亮错误 as.vector(x, "character") 中的错误:无法将类型 'closure' 强制转换为类型 'character' 的向量
r shiny error Error in as.vector(x, "character") : cannot coerce type 'closure' to vector of type 'character'
尝试将用户输入的输入 (empId) 从 Shiny UI 传递到 Shiny 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))
})
为了测试我的查询是否有效,我用 sql 中的实际 EmployeeID 累了这个,如下所示
.
.
sql1 = sqlQuery(acc_con1, paste0('select Title from dbo.Employee where EmployeeID = 8'))
.
.
我得到一个正常的输出,
Title
Production Technician - WC10
当我尝试使它对用户输入做出反应时,我看到错误 as.vector(x, "character") : cannot coerce type 'closure' to vector of type 'character.. .error...需要帮助。
代码中的主要问题是您将反应函数 "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 的观点
Main problem in your code is that you give reactive function "a1" as argument to sqlQuery function. sqlQuery expects you to give character as argument.
但是解决方案要简单得多:您应该简单地调用 a1() 而不是 a1,因为您已将其定义为反应函数。
sql1 = sqlQuery(acc_con1, paste0('select Title from dbo.Employee where EmployeeID=',a1()))
你能试试吗?
尝试将用户输入的输入 (empId) 从 Shiny UI 传递到 Shiny 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))
})
为了测试我的查询是否有效,我用 sql 中的实际 EmployeeID 累了这个,如下所示
.
.
sql1 = sqlQuery(acc_con1, paste0('select Title from dbo.Employee where EmployeeID = 8'))
.
.
我得到一个正常的输出,
Title
Production Technician - WC10
当我尝试使它对用户输入做出反应时,我看到错误 as.vector(x, "character") : cannot coerce type 'closure' to vector of type 'character.. .error...需要帮助。
代码中的主要问题是您将反应函数 "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 的观点
Main problem in your code is that you give reactive function "a1" as argument to sqlQuery function. sqlQuery expects you to give character as argument.
但是解决方案要简单得多:您应该简单地调用 a1() 而不是 a1,因为您已将其定义为反应函数。
sql1 = sqlQuery(acc_con1, paste0('select Title from dbo.Employee where EmployeeID=',a1()))
你能试试吗?