我编写的一个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没有“显示”,因此不知道如何处理弹出的进度条窗口。我想知道是否有一种方法可以在完全禁用进度条的情况下解决这个问题。
发布于 2016-04-04 16:36:28
如果您不需要与显示器上的任何内容交互,只需让应用程序代码显示其进度条,最简单的方法就是在EC2实例上放置一个无头X服务器(可能是Xvfb)。这将允许Tcl端的Tk包初始化自身,进而使事情在R端工作。
否则,如果您通过ssh访问EC2实例,则可以使用X转发来允许进度条在本地系统上运行。显然,要做到这一点,您需要运行本地X服务器,这在某些平台上很容易,但在其他平台上却非常笨拙,这一主题必须在其他地方得到更好的回答。您也可以使用VNC或Remote Desktop来实现此功能,尽管我在使用它们方面的经验要少得多。
如果这两者都不起作用,并且GUI部分实际上只是一个进度条和其他杂乱的部分,那么您必须进入并编辑代码以去除GUI部分。这是您可以在本地处理的东西。第一步可能是禁用tcltk包的加载(找到library("tcltk")并删除它),然后遍历并修复(可能通过策略删除)所有损坏的部分。希望不会太多!还请记住,您可能很幸运,会发现您正在使用的代码只是一个围绕其他东西的图形用户界面包装器,只是设置参数并提供监视;对于无头工作,您可以不进行监视,也可以只将“I'm not dead yet”消息输出到控制台。
https://stackoverflow.com/questions/36390211
复制相似问题