我希望能夠從R打開一個excel會話,寫入它,然後關閉從R的excel會話。雖然我可以在同一個函數內完成這一切,但我試圖概括清理excel的代碼。但是,不管怎樣,當我通過傳入excel對象從函數調用gc()時,它不會收集垃圾。下面是代碼:R中的垃圾收集com對象
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)
當我致電上述兩個功能,我仍然可以看到Excel的會議我的任務管理器運行。但是,如果我從cleanupexcel()返回後調用gc(),則會成功終止excel會話。
關於如何從一個通用函數中成功完成任何想法或者是否存在其他一些問題?
IIRC刪除指定爲COM對象的對象僅刪除指針,但不關閉對象。嘗試將所有啓動爲對象的對象設置爲NULL,然後手動調用gc()。例如。在excel和wb等之上。 – Hansi