【问题标题】:user-input and ESS用户输入和 ESS
【发布时间】:2010-12-04 20:58:43
【问题描述】:

当您要求 ESS 从缓冲区(C-c、C-b 或类似)评估以下内容时

par(ask=TRUE)
plot(1,1)
plot(2,1)

解释器进入无限循环,因为 ESS 使用参数 --no-readline 启动 R 会话。循环可以用 C-g 打破,但有什么方法可以让解释器真正请求用户输入?

【问题讨论】:

    标签: r emacs ess


    【解决方案1】:

    一种解决方案是编辑ess-r-d.el 并删除赋予R 的硬编码--no-runtime 选项,这是最新实现的第127 行。

    改变

      (let* ((r-always-arg
          (if (or ess-microsoft-p (eq system-type 'cygwin))
              "--ess "
            "--no-readline "))
    

      (let* ((r-always-arg
          (if (or ess-microsoft-p (eq system-type 'cygwin))
              "--ess "))
    

    如果有编译版本,则必须编译.el生成并替换二进制.elc文件。

    文件可能是(目录的位置取决于您的操作系统)

    • site-lisp 目录中。在 emacs (^X^F) 中编辑.el 文件,然后执行M-x byte-compile-file 以生成.elc

    • 如果您从整个 zip/tar 源程序包安装,则位于 lisp 目录中。在这种情况下,更改后执行make,然后执行make install

    您当然需要拥有write 访问.el.elc 文件的权限。

    如果您对 .el 文件的编译感到不满意,您可以简单地将其删除 (.elc) 并仅使用 .el 版本(应该只是轻微的性能差异)。

    【讨论】:

    • 说得好。如果 OP 询问他们如何解决这个问题,你知道 stat.ethz.ch/mailman/listinfo/ess-help 上的吹牛者会说什么吗?他们会说“你不应该首先使用 readline,内置的 ESS 功能更好,等等等等。”因为他们当然比用户更了解什么对用户最好。感谢您记录此补丁,而不是向 OP 讲授他们“应该”做什么。
    【解决方案2】:

    (从 Google 和 RSiteSearches 收集的策略):

    您是否在任何会话窗口中看到提示:“点击返回”?如果是这样......打。

    如果没有,请尝试在绘图窗口中单击。

    如果失败了,你应该用 c-G 重新获得控制权。

    编辑:进一步的策略,诚然没有解决 ESS 非交互性问题:如果您想保留用户输入,则可以使用 readLines:

    input=file("stdin")
    print(readLines(input,1))
    

    【讨论】:

    • 提示符只在点击 c-G 后出现,并且 c-G 不只是跳出等待用户输入的循环,它会停止执行剩余的脚本。
    • 所以为了清楚起见,出现了一个绘图窗口,尽管在窗口中单击以获取焦点,但您没有看到提示?
    • 你说的很对。当我在一个干净的 R 会话中开始时,我之前拥有的脚本,只执行了一个情节没有问题。我在原始问题中添加了第二个情节,以便我描述的问题是可重现的。
    • 我建议你也可以在 ESS 邮件列表中询问:stat.ethz.ch/mailman/listinfo/ess-help
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-05
    • 1970-01-01
    相关资源
    最近更新 更多