我希望能够从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