【问题标题】:Displaying help in R immediately (Rstudio)立即在 R 中显示帮助 (Rstudio)
【发布时间】:2015-07-30 16:45:48
【问题描述】:

我正在 R 中创建一个包,它将通过 tcltk 包具有 GUI 界面。前端函数将通过 GUI 从用户那里获取数据,并调用后端函数将结果返回给前端。目前我已经编写了所有函数的文档,除了这部分和一些bug测试之外,函数也完成了。

为了帮助用户,我希望能够打印文档。在 Rstudio 中,它会显示在帮助窗口中(需要注意的是,这个窗口不是我的代码通过 tcltk 包创建的,这个窗口是 Rstudio 的一部分)。

如果我的函数只通过命令行与用户交互,我可以让 Rstudio 中的帮助屏幕立即更新。但是,如果我正在使用图形,则帮助窗口在功能完成之前不会更新,这违背了让它首先打印帮助屏幕的目的。

以下是通过 tcltk 包创建的 GUI 窗口示例。我在这里使用 var.test 作为示例文档,因此请确保您的帮助窗口位于其他位置,以便查看帮助屏幕何时更新。

require(tcltk)
print(help(var.test))

hi <- tktoplevel() #creates a window

ok <- function() # this function is called by pushing the button defined below
{
  print("Goodbye, World!")
  tkdestroy(hi)    # destroys the window
}

print("Hello, World!")

ok.button <- ttkbutton(hi, text = "This is a button", command = ok) #defines the button
tkgrid(ok.button) #puts the button on the window "hi"

tkfocus(hi)

tkwait.window(hi)

如您所见,即使在创建 tcltk 图形窗口之前先调用帮助函数,也不会更新帮助窗口。打印功能似乎仍然有效,因为在按下按钮之前打印了“Hello, World”。

为了让我的功能正常工作,我必须使用 tkwait.window(),否则前端不会与后端同步。

如果真的不可能更新 Rstudio 窗口,那么使用不同窗口或程序的替代解决方案是可以接受的。

【问题讨论】:

    标签: r rstudio


    【解决方案1】:

    在尝试打印帮助后在您的代码中添加一点延迟:

    ....
    print(help(var.test))
    # Sys.sleep(0.01)  # too short
    Sys.sleep(0.5)   # long enough
    ...
    

    这适用于 Linux 和 Windows...

    我猜 RStudio 在执行 R 命令批处理(您一次发送到 R 的所有命令)时不会更新 GUI,因为它阻止更新在“阻塞子线程”中执行 R,因此表现得像“单线程”所以在 R 批处理执行结束之前无法更新 GUI。

    sleep 函数似乎将控制权返回给 RStudio(GUI?)进程,以便它可以更新 GUI。

    如果您将睡眠时间减少太多,您可以观察到 RStudio GUI 的部分更新。

    PS:使用process.events() 不起作用!

    【讨论】:

    • 这在 0.5 时对我不起作用,但在 1 时确实有效。我想知道每个人的美好时光。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-21
    • 1970-01-01
    • 2017-12-11
    • 2015-11-10
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多