2016-04-03 35 views
0

我写的R函数在EC2实例上运行时导致我遇到问题。它使用tcltk2包创建进度条来监视功能进度。什么工作以及在桌面实例在EC2上返回以下错误:R tcltk2虚拟机上的进度条错误(AWS 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

好的,如果没有显示,那么你想在哪里显示进度条? – helloV

+0

我想在桌面实例上启用tcltk,并在服务器实例上禁用它。 –

回答

1

如果您不需要与显示屏上的任何内容进行交互,但只需让应用程序代码显示其进度栏,最简单的方法就是在EC2实例上放置一个无头X服务器(可能为Xvfb)。这将允许Tcl端的Tk包自行初始化,而这又会使事情在R端工作。否则,如果您通过ssh访问EC2实例,则可以使用X转发来允许进度条在本地系统上运行。显然,为了实现这个目标,你需要运行一个本地的X服务器,这在某些平台上很容易,而在其他平台上很容易,而且在其他地方必须有更好的回答。您可能也可以通过VNCRemote Desktop获得此工作,但我与他们合作的经验较少。

如果这些都不起作用,并且GUI部分实际上只是一个进度条和其他杂项位,则必须进入并编辑代码以摆脱GUI部分。这是你可以在本地工作的东西。第一步可能是禁用加载tcltk包(找到library("tcltk")并将其删除),然后通过并修复(可能通过策略删除)所有打破的部分。希望这不会太多!还要记住,你可能很幸运,发现你正在使用的代码只是一个GUI包装器,只是设置参数并提供监控;对于无头工作,您可以不进行监控,也可以将“I'm not dead yet”消息打印到控制台。

+0

谢谢你的帮助Donal!问题是这个函数是我的软件包“bdrift”的基石,在执行时它不应该需要最终用户的进一步关注。 我知道许多软件包用户都在EC2上的标准Rstudio服务器上,或者使用闪亮的软件,而且我希望无论如何都能部署软件包。 我可能会在下一个软件包版本中删除进度条,因为它没有真正达到目的 - 除了看起来很漂亮:P 但是,无论如何,也许我会创建分支,只有我会使用并尝试您的建议。 –