我编写的R函数在EC2实例上运行时会导致问题。它使用tcltk2包创建进度条以监视功能进度。在桌面实例上运行良好的方法会在EC2上返回以下错误:
Error in structure(.External(.C_dotTclObjv, objv), class = "tclObj") :
[tcl] invalid command name "toplevel".
In addition: Warning message:
In fun(libname, pkgname) : couldn't connect to display ":0"
我想问题是EC2没有"显示"因此不知道如何处理弹出的进度条窗口。我想知道是否有办法解决这个问题而不完全禁用进度条。
答案 0 :(得分:1)
如果您不需要与显示器上的任何内容进行交互,只需让应用程序代码显示其进度条,最简单的方法是将无头X服务器(可能是Xvfb)打开EC2实例。这将允许Tcl端的Tk包初始化自己,反过来这将使事情在R方面起作用。
否则,如果您通过ssh访问EC2实例,则可以使用X转发来允许进度条在本地系统上运行。显然,为了实现这一目标,你需要运行一个本地的X服务器,这在某些平台上很容易,而在其他平台上却很尴尬,而且其他主题必须得到更好的回答。您也可以使用VNC或Remote Desktop来使用此功能,但我使用它们的经验要少得多。
如果这些都不起作用,并且GUI部分实际上只是一个进度条和其他杂项,你必须进入并编辑代码以摆脱GUI部分。这是你可以在本地工作的东西。第一步可能是禁用tcltk包的加载(查找library("tcltk")
并删除它),然后通过并修复(可能通过策略删除)所有中断的部分。希望,这不会太多!还要记住,您可能很幸运,并且发现您正在使用的代码只是一个围绕其他东西的GUI包装器,只是设置参数并提供监控;对于无头工作,您可以不进行监控,也可以只向控制台打印“I'm not dead yet”消息。