【问题标题】:R tcltk: error when trying to display a png file depending on the OSR tcltk:尝试根据操作系统显示 png 文件时出错
【发布时间】:2016-10-09 20:13:47
【问题描述】:

这是我在使用 R 编写的不同代码时遇到的问题。 基本上,我想生成一个显示图片(.png 文件)的窗口。根据thisthis 的指导,我想出了这样的代码:

library(tcltk)
tmpFile <- tempfile(fileext = ".png")
download.file("https://www.r-project.org/logo/Rlogo.png", tmpFile)

tcl("image","create","photo", "imageLogo", file=tmpFile)
win1 <- tktoplevel()
tkpack(ttklabel(win1, image="imageLogo", compound="image"))

这在 Mac OS 下可以正常工作,但在 Linux 或 Windows 上却不行,我会看到这样的错误消息:

[tcl] 无法识别图像文件中的数据

当我想显示图表时,我可以找到一些解决方法,例如使用包tkrplotigraph。尽管如此,我真的很想知道为什么在 Linux 或 Windows 上运行我的脚本时会出现这样的错误,而它在 Mac OS 上运行得很好。

如果这个问题很明显,我深表歉意,但我没有发现任何关于 tcltk 软件包的潜在差异,具体取决于操作系统。

【问题讨论】:

  • 涉及到哪些版本的Tk库?这很重要,因为直到 8.6 才在 Tk 中原生支持 PNG。 (我写了相当多的代码……)
  • 在我的 Windows 版本的 R 3.3.1 上,我有 tcl 8.5,在 R 3.3.1 下的 Ubuntu 上,我有 tcl 8.6,所以这似乎是 @Donal Fellows 所想的不同。问题中的代码在带有 gif 文件的 Windows 上对我有用。

标签: r tcl png tk


【解决方案1】:

Tk 对 PNG 的原生支持是在 8.6 中添加的。在此之前,您需要将tkimg extension 加载到到Tk 中以添加所需的图像格式处理程序。如果您安装的 R 使用的 Tcl/Tk 设置正确,您可能可以使用:

tclRequire("Img")

一旦你对事物进行了充分的初始化。是的,由于历史原因,内部使用的名称是“Img”,但这根本无法搜索! (这是关键in this mailing list message from way back。)

但是,将 Tcl 和 Tk 的版本升级到 8.6 可能是一个更好的举措。

【讨论】:

  • 非常感谢您的回答,@donal-fellows!我从你的回答以及你和@g-grothendieck 的 cmets 中得到:1)我必须使用最新版本的 R(我不觉得 Tcl/Tk 是作为独立库安装的我的 Windows 发行版,但我可能错了) 2)我最好使用原生支持的格式,例如 gif(遵循this BTW)。 3)最后,我也可以使用包“Img”(但我需要先弄清楚R是如何与Tk交互的)
  • 在 Windows 上,tcl 与 R 捆绑在一起。在 R 中,它位于 R.home("Tcl") 树中。 R 3.4,R 的开发版,目前确实在 Windows 下提供了 tcl 8.6。
【解决方案2】:

最后,最近,我想结束这个问题并总结一下针对我的问题提出的不同建议:

  • R 随 Tcl 8.5 一起提供,即使是最新版本 3.3.2,这意味着无法使用常用命令将 PNG 文件嵌入到由 Tcl/Tk 创建的窗口中。由于某些原因,它可以在 Mac OS 上运行,但不要指望它可以在其他操作系统上轻松运行。
  • 为了在 R 中由 Tcl/Tk 生成的窗口中显示图片、图形等,最好寻找使用 GIF 支持(如果可能)或尝试替代解决方案(请参阅问题以了解可能的替代选项)。
  • 如果真的想显示 PNG 文件,解决方案包括安装 Tcl 8.5(例如 ActiveTcl)和扩展 Img。为了使用您刚刚安装在计算机上的 Tcl/Tk 包,您可以参考 R FAQ for Windows 例如(如常见问题解答中所述,您需要安装 Tcl 8.5 - 我尝试使用 Tcl 8.6,从而希望能解决我的问题,但它没有用)。基本上,您需要设置一个环境变量(MY_TCLTK)并放置安装包 Tcl/Tk 的路径。不用说,Tcl/Tk 在 R 中通常用于实现 GUI;如果您必须通过非常复杂的程序来设置系统,那么该软件包肯定会失去其优势。
  • 最后,由于 Tcl 8.6 迟早会与 R 一起提供(已在开发版本中实现),因此这个问题事实上已经过时了。

【讨论】:

    猜你喜欢
    • 2016-11-12
    • 1970-01-01
    • 2014-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-09
    • 2016-01-11
    • 2019-12-26
    相关资源
    最近更新 更多