У нас есть несколько баз данных 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 теперь работает - он обрабатывает альтернативную функцию при ошибке, но также показывает предупреждения об ошибке, что имеет смысл.