R tryCatch RODBC функция проблема - PullRequest
0 голосов
/ 24 апреля 2019

У нас есть несколько баз данных 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]: попытка применить не-функцию

Я предполагаю, что это потому, что я неправильно использую TryCatch внутри UDF?

Есть ли у кого-нибудь какие-либо советы о том, что я делаю неправильно,или даже если это лучший способ сделать то, что я пытаюсь сделать?

Спасибо

(извините, если это неправильно отформатировано, из-за того, что сообщение на моем телефоне было заблокировано из-за того, что публикация Stackoverflow заблокирована)

Редактировать - я думаю, что я исправил проблему «Ошибка в значении [3L]», добавив функцию (e) {} к матричной функции в части ошибки tryCatch.

Теперь проблемаявляется что скрипт просто терпит неудачу, если он не может добраться до одной из баз данных, вместо выполнения матричной функции.Нужно ли добавить что-то еще, чтобы игнорировать ошибку?

Редактировать 2 - кажется, что tryCatch теперь работает - он обрабатывает альтернативную функцию при ошибке, но также показывает предупреждения об ошибке, что имеет смысл.

1 Ответ

0 голосов
/ 24 апреля 2019

Как упомянуто в редактировании выше, использование 'function (e) {}' для переноса функции Matrix в разделе ошибок в tryCatch решило проблему 'Ошибка в значении [3L]', поэтому скрипт теперь работает, но отображает сообщения об ошибках, если он не может получить доступ к определенному каналу. Я предполагаю, что раздел 'warning' tryCatch может быть использован для их корректировки по мере необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...