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代码示例