我们在服务器上有许多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){}来解决“ value [3L]中的错误”问题。
现在的问题是,如果脚本无法访问数据库之一,则脚本只会失败,而不是执行矩阵函数。我是否需要添加其他内容以使其忽略该错误?
编辑2-似乎tryCatch现在可以工作-它处理 错误时的备用功能,但也会显示有关错误的警告,这是有道理的。
答案 0 :(得分:0)
如上面的编辑中所述,使用'function(e){}'将Matrix函数包装在tryCatch的错误部分中,修复了'Error in value [3L]'问题,因此脚本现在可以使用,但是如果无法访问特定频道,则会显示错误消息。我猜想tryCatch的“警告”部分可以根据需要进行调整。