gpt4 book ai didi

r - R中的垃圾收集com对象

转载 作者:行者123 更新时间:2023-12-01 15:55:02 24 4
gpt4 key购买 nike

我希望能够从 R 打开一个 excel session ,写入它,然后从 R 关闭 excel session 。虽然我可以在同一个函数中完成这一切,但我试图概括清理代码卓越的。但是,不知何故,当我通过传入 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)

当我调用上面的两个函数时,我仍然可以在我的任务管理器中看到正在运行的 excel session 。但是,如果我在从 cleanupexcel() 返回后调用 gc(),它会成功终止 excel session 。

关于如何从通用函数成功进行 gc 的任何想法,或者我在这里遇到的其他问题?

最佳答案

这是对您的代码的一个小改动,应该可以正常工作(我现在在 Linux 上,所以我无法对其进行测试)。主要修复是将 excel 实例包装在环境中并返回它。

close 然后可以访问该实例,然后在调用 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")

# wrap excel in an environment
env <- new.env(parent=emptyenv())
env$instance <- excel
env
}

cleanupexcel<-function(excel) {
comInvoke(excel$instance,"Quit")
rm("instance", envir=excel)
gc()
}

myexcel <- opentest()
cleanupexcel(myexcel)

...请注意,您的旧代码需要将该变量命名为“excelobj”,因为您已将其从 cleanupexcel 函数中删除。这不太好。

好吧,有一些非常微妙的问题在起作用,所以这是一个没有 excel 的可重现示例:

opentest<-function() {
excel<-new.env()
reg.finalizer(excel, function(x) { cat("FINALIZING EXCEL!\n") }, FALSE)

# wrap excel in an environment
env <- new.env(parent=emptyenv())
env$instance <- excel
env
}

cleanupexcel<-function(excel) {
cat(excel$instance,"\n")
rm("instance", envir=excel)
gc()
}

myexcel <- opentest()
cleanupexcel(myexcel)
# Prints "FINALIZING EXCEL!"

关于r - R中的垃圾收集com对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12167106/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com