R から Excel セッションを開き、それに書き込み、R から Excel セッションを閉じることができるようにしたいと考えています。これはすべて同じ関数内から実行できますが、Excel のクリーンアップのコードを一般化しようとしています。しかし、どういうわけか、Excel オブジェクトを渡して関数から gc() を呼び出すと、ガベージ コレクションが行われません。以下はコードです:
opentest<-function() {
excel<-comCreateObject("Excel.Application")
comSetProperty(excel,"Visible",T)
comSetProperty(excel,"DisplayAlerts",FALSE)
comSetProperty(excel, "SheetsInNewWorkbook", 1)
wb <- comGetProperty(excel, "Workbooks")
wb <- comInvoke(wb, "Add")
excel
}
cleanupexcel<-function(excelobj) {
comInvoke(excelobj,"Quit")
rm(excelobj, envir=globalenv())
eapply(env=globalenv(), gc)
}
関数への次の呼び出しを使用します。
excelobj<- opentest()
cleanupexcel(excelobj)
上記の 2 つの関数を呼び出しても、タスク マネージャーで実行中の Excel セッションを確認できます。ただし、cleanupexcel() から戻った後に gc() を呼び出すと、Excel セッションが正常に強制終了されます。
ジェネリック関数から正常に gc できる方法についてのアイデアはありますか、それとも他に何か問題がありますか?