r shiny error as.vector中的错误(x,"字符"):不能强制类型'关闭'对于类型'字符'

时间:2015-02-27 04:46:59

标签: sql r parameter-passing shiny shiny-server

尝试将用户输入的输入(empId)从Shiny UI传递到闪亮服务器上的sql查询时。不确定如何调试此错误。

 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,"字符"):无法强制键入'关闭'向量类型的向量...错误...需要帮助。

2 个答案:

答案 0 :(得分:1)

代码中的主要问题是您将反应函数“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))
 )}

答案 1 :(得分:0)

我也同意@Mikael Jumppanen

  

您的代码中的主要问题是您提供被动功能" a1"作为sqlQuery函数的参数。 sqlQuery希望你将字符作为参数。

然而,解决方案更简单:你应该简单地调用a1()而不是a1,因为你已经将它定义为反应函数。

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

你能试试吗?