【发布时间】:2019-04-24 22:35:56
【问题描述】:
我们在服务器上有许多 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 的错误部分的矩阵函数周围添加 function(e) {} 解决了“值错误 [3L]”问题。
现在的问题是,如果脚本无法访问其中一个数据库,而不是执行矩阵函数,它就会失败。我是否需要添加其他内容以使其忽略错误?
编辑 2 - 似乎 tryCatch 现在可以工作 - 它处理 错误时的替代功能,但也显示有关错误的警告,这是有道理的。
【问题讨论】: