【发布时间】: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 打破,但有什么方法可以让解释器真正请求用户输入?
【问题讨论】:
当您要求 ESS 从缓冲区(C-c、C-b 或类似)评估以下内容时
par(ask=TRUE)
plot(1,1)
plot(2,1)
解释器进入无限循环,因为 ESS 使用参数 --no-readline 启动 R 会话。循环可以用 C-g 打破,但有什么方法可以让解释器真正请求用户输入?
【问题讨论】:
一种解决方案是编辑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 版本(应该只是轻微的性能差异)。
【讨论】:
(从 Google 和 RSiteSearches 收集的策略):
您是否在任何会话窗口中看到提示:“点击返回”?如果是这样......打。
如果没有,请尝试在绘图窗口中单击。
如果失败了,你应该用 c-G 重新获得控制权。
编辑:进一步的策略,诚然没有解决 ESS 非交互性问题:如果您想保留用户输入,则可以使用 readLines:
input=file("stdin")
print(readLines(input,1))
【讨论】: