R tryCatch RODBC函数问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了R tryCatch RODBC函数问题相关的知识,希望对你有一定的参考价值。

我们在服务器上有许多MS Access数据库,这些数据库是远程位置的副本,可以在一夜之间更新。我们每天整理来自这些机器的一些数据用于报告目的。有时隔夜更新失败,这意味着我们无法访问所有数据库,所以我试图编写一个R脚本,它将测试我们是否可以连接(使用数据库路径列表),并输出更新版本列表中只包括我们可以连接的那些。然后,这将用于运行另一个脚本,该脚本仅更新与可用数据库相关的数据。

这就是我到目前为止所做的事情(我是R的新手,但在SAS和SQL方面相当精通 - 试图将R既用作学习练习又可以节省成本);

{

# Create Store data locations listing

A=matrix(c(1000,1,"One","//Server/Comms1/Access.mdb"

,2000,2,"Two","//Server/Comms2/Access.mdb"

,3000,3,"Three","//Server/Comms3/Access.mdb"

)

,nrow=3,ncol=4,byrow=TRUE)

# Add column names

colnames(A)<-c("Ref1","Ref2","Ref3","Location")



#Create summary for testing connections (Ref1 and Location)

B<-A[,c(1,4)]



ConnectionTest<-function(Ref1,Location)

{

out<-tryCatch({ch<-odbcDriverConnect(paste("Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=",Location))

sqlQuery(ch,paste("select ",Ref1," as Ref1,COUNT(variable) as Count from table"))}

,error=matrix(c(Ref1,0),nrow=1,ncol=2,byrow=TRUE)

)

return(out)

}



#Run function, using 'B' to provide arguments

C<-apply(B,1,function(x)do.call(ConnectionTest,as.list(x)))

#Convert to matrix and add column names

D<-matrix(unlist(C),ncol=2,byrow=T)

colnames(D)<-c("Ref1","Count")


} 

当我运行脚本时,我收到以下错误消息;

值[3L]出错:尝试应用非功能

我猜这是因为我在UDF中错误地使用了TryCatch?

有没有人对我做错了什么有任何建议,或者即使这是我尝试做的最佳方式?

谢谢

(如果格式不正确,由于Stackoverflow发布被阻止而不得不在我的手机上发帖,请道歉)

编辑 - 我想通过在tryCatch的错误部分的矩阵函数周围添加函数(e){}来修复'错误值[3L]'问题。

现在的问题是,如果脚本无法访问其中一个数据库,而不是执行矩阵功能,则脚本会失败。我是否需要添加其他内容才能使其忽略错误?

编辑2 - 似乎tryCatch现在可以工作 - 它在出错时处理备用函数,但也显示有关错误的警告,这是有道理的。

答案

如上面的编辑所述,使用'function(e){}'将Matrix函数包装在tryCatch的错误部分中修复了'Error in value [3L]'问题,因此脚本现在可以正常工作,但显示错误消息如果它无法访问特定频道。我猜测tryCatch的'warning'部分可用于根据需要调整这些。

以上是关于R tryCatch RODBC函数问题的主要内容,如果未能解决你的问题,请参考以下文章

R语言使用tryCatch函数调试R代码实战:tryCatch函数运行正常R代码tryCatch函数运行有错误(error)的R代码示例/tryCatch函数运行有警告(warning)的R代码示例

在 R 中使用 RODBC 创建循环 SQL QUERY

将 R 变量传递给 RODBC sql 查询? [复制]

在 R 中编写更简单的 tryCatch 版本

通过 RODBC 包从 SQL 读取视图

try 或 tryCatch 与引导 R