【问题标题】:R tryCatch RODBC function issueR tryCatch RODBC 函数问题
【发布时间】: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 现在可以工作 - 它处理 错误时的替代功能,但也显示有关错误的警告,这是有道理的。

【问题讨论】:

    标签: r odbc


    【解决方案1】:

    正如上面编辑中提到的,使用 'function(e) {}' 将 Matrix 函数包装在 tryCatch 的错误部分修复了 'Error in value[3L]' 问题,因此脚本现在可以工作,但是如果无法访问特定频道,则会显示错误消息。我猜 tryCatch 的“警告”部分可用于根据需要进行调整。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-18
      • 1970-01-01
      • 2018-10-02
      • 2014-07-17
      • 1970-01-01
      • 1970-01-01
      • 2017-07-16
      相关资源
      最近更新 更多