r 闪亮错误 as.vector(x, "character") 中的错误:无法将类型“闭包”强制转换为“字符”类型的向量

Posted

技术标签:

【中文标题】r 闪亮错误 as.vector(x, "character") 中的错误:无法将类型“闭包”强制转换为“字符”类型的向量【英文标题】:r shiny error Error in as.vector(x, "character") : cannot coerce type 'closure' to vector of type 'character' 【发布时间】:2015-04-29 17:32:04 【问题描述】:

在尝试将用户输入的输入 (empId) 从 Shiny UI 传递到 Shiny 服务器上的 sql 查询中时。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")))))

服务器.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") 中的错误:无法将类型“闭包”强制转换为类型为“字符...错误...需要帮助”。

【问题讨论】:

【参考方案1】:

我也同意@Mikael Jumppanen 的观点

您的代码中的主要问题是您将反应函数“a1”作为 sqlQuery 函数的参数。 sqlQuery 期望您将字符作为参数。

但是解决方案要简单得多:您应该简单地调用 a1() 而不是 a1,因为您已将其定义为反应函数。

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

你可以试试吗?

【讨论】:

【参考方案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))
 )

【讨论】:

:( 这给了我错误,找不到对象 t1,事实上我昨晚找到了解决这个问题的方法,我将所有东西都移到了响应式中并且它起作用了。 好吧,如果没有最小的工作示例,就很难测试。但是将所有内容移动到响应式中应该可以工作。很好,你得到它的工作。 您可以尝试将函数调用添加到 a1:这是应该调用响应式的方式,a1() 而不是 a1。看我的回答

以上是关于r 闪亮错误 as.vector(x, "character") 中的错误:无法将类型“闭包”强制转换为“字符”类型的向量的主要内容,如果未能解决你的问题,请参考以下文章

闪亮的 ui.R - 标签中的错误(“div”,列表(...)) - 不确定错误在哪里

错误:所有观察都在同一组中,同时从闪亮的ui列表中动态过滤R模型

R闪亮:observeEvent和eventReactive的不同行为

使用 doparallel 在 foreach 循环内循环

R入门Day2:数据类型1---向量

尝试从 R 脚本渲染闪亮的 flexdashboard 时找不到错误对象输出