首页 > 解决方案 > as.character(query) 中的错误:无法将类型“闭包”强制转换为“字符”类型的向量

问题描述

我试图从 oracle 数据库中加载一些数据,在此过程中,每一行代码都很好,直到我尝试运行最后一行: df<- sqlQuery(sql_connection,sql_statement,stringsAsFactors=0),标题中出现错误。

所以这是我的代码的基本结构:

require(RODBC)
require(lubridate)
require(stringr)
require(dplyr)
require(tidyr)

#server for N2 purge attribute
target <- "xxxx"
user   <- "xxxx"
pass   <- "xxxx"


#print("Working on lot history...")


sql_string <- paste0("select
xxxx
from
xxxx
where
xxxx

")

sql_statement <- sprintf

#sql_statement <- sprintf(sql_string, BackDate, DidList[m])
sql_connection <- odbcConnect(dsn = target, uid = user, pwd = pass,believeNRows=FALSE)

df<- sqlQuery(sql_connection,sql_statement,stringsAsFactors=0)

因为我是 R 新手,所以我觉得我无法判断错误的原因在哪里。如果有人可以帮助我解决这个问题,我将不胜感激。

标签: sqlr

解决方案


在这一行中,您将基本功能分配sprintfsql_statement

sql_statement <- sprintf

然后将其sqlQuery()作为第二个参数 ( query) 传递给:

df<- sqlQuery(sql_connection,sql_statement,stringsAsFactors=0)

该函数期望query是一个字符,因此您会得到错误,即 R 无法将“闭包”(本质上是函数的另一个名称)强制转换为字符。

我假设您试图模仿这条注释掉的行:

#sql_statement <- sprintf(sql_string, BackDate, DidList[m])

但是,如果您只想运行刚刚编写的查询,则没有必要。因此,如果我们只是整理您的代码以便sql_string直接传递给sqlQuery(),它应该可以按预期工作,尽管我无法实际测试它,因为我们无权访问您的数据库:

require(RODBC)
require(lubridate)
require(stringr)
require(dplyr)
require(tidyr)

#server for N2 purge attribute
target <- "xxxx"
user   <- "xxxx"
pass   <- "xxxx"

#print("Working on lot history...")

sql_string <- paste0("select
xxxx
from
xxxx
where
xxxx
")

sql_connection <- odbcConnect(dsn = target, uid = user, pwd = pass,believeNRows=FALSE)
df<- sqlQuery(sql_connection,sql_string,stringsAsFactors=0)

推荐阅读