防止 Rstudio 控制台显示脚本命令

Posted

技术标签:

【中文标题】防止 Rstudio 控制台显示脚本命令【英文标题】:Prevent Rstudio console from showing script commands 【发布时间】:2016-05-19 12:54:16 【问题描述】:

我正在使用 Rstudioscript.R 运行数百个代码行,但与 Matlab 相比让我有点恼火的是 Rstudio 控制台保持机械地显示每个command line 来自我的脚本文件。有没有办法防止这种情况发生?

令人沮丧的部分出现了,例如,当使用sprintf() 时,脚本文件中的命令行与控制台中的sprintf() 混淆了。

最好的,

【问题讨论】:

在获取脚本时不是有两个选项:Source 和 Source with Echo?听起来您正在单击 Source with Echo。我总是点击普通的 Source 并且看不到脚本行。 @drhagen:感谢您强调与Echo 的差异,尽管我没有点击其中任何一个。在编写脚本时,我使用ctrl +a 执行它,然后使用f5。根据您的反馈,当我点击普通的Source 时,问题是sprintf() 没有出现在控制台中。 那是因为 sprintf 不打印到命令行;它创建一个字符串。如果您逐行运行,REPL 会为您打印裸值以方便您(就像裸 1+1 一样),但获取脚本并不会这样做,它只会丢弃它们。在sprintfs 周围放置一个print() @drhagen 不,print 也不是真正的工具——message 是。 @drhagen: thx.that 解决了我的问题。最好的。 【参考方案1】:

对此的更新可能对将来的搜索有所帮助,如果您使用 Rstudio 中的“source”按钮(脚本编辑器窗口的右上角),它将默认为“source' 或 'source with echo' 取决于它收到的最后一个键盘输入源。

因此,如果您单击“ctrl+shift+enter”,则每次使用“源”按钮时,它总是会“带回声源”(即将所有脚本命令打印到控制台)。

如果您单击“ctrl+shift+s”,那么每次您随后使用“source”按钮时它都会简单地获取源(即不将脚本命令打印到控制台)。

【讨论】:

【参考方案2】:

只需将您希望从控制台抑制的代码行括在 () 之间:

1+1
output looks:
> 1+1
[1] 2

(1+1)
output looks:
> [1] 2

【讨论】:

【参考方案3】:

与 Matlab 的 sprintf 一样,R 的 sprintf 只创建一个字符串,它不会将其打印到输出中。* 您必须显式调用 print 函数才能看到任何内容:

print(sprintf("%f", pi)) # prints

一个普通的sprintf 正式创建一个字符串然后丢弃它,因为它没有保存到变量中:

sprintf("%f", pi) # does nothing

但是,这种方法对您有用,因为 REPL(一次运行 R 代码的命令行)违反了丢弃未保存到变量的值的指令,而是打印它们。这是一件方便的事情,可以更轻松地在命令行上工作。您可以键入 1+1 并让它打印 2,即使 R 脚本通常会默默地丢弃该值。

将文本打印到控制台的其他函数是catmessage,它们都略有不同。请参阅他们的帮助文件以了解使用情况。

* 从技术上讲,Matlab 将打印任何未被; 终止的语句的值,包括字符串。因此,如果没有分号,sprintf 产生的字符串可以被打印,尽管它不是由sprintf 直接完成的,而是由 Matlab 的通用 print-all-the-things 行为完成的。在我看来,这是一个奇怪的功能。

【讨论】:

Matlab: sprintf('invalidate misunderstanding') 中测试这个并更新你的断言。 @owner 在 Matlab 中测试:1 + 2。然后测试'invalidate misunderstanding'。你会看到它打印了一些东西。然而,1 + 2'invalidate misunderstanding' 显然都不是打印语句。 sprintf 也是如此。【参考方案4】:

使用 ctrl+shift+S 运行您的代码。或者转到script.R 右上角的源代码,然后只运行Source 而不是Source with echo。而且,对于您打印@Konrad Rudolph 的要求,使用消息message("%f", pi) 的建议是最好的解决方案。

如果打印消息是为了跟踪代码的状态,这里有一些有用的解决方案showing a status message in R

【讨论】:

【参考方案5】:

如果您只想运行 script.R,请尝试使用 source 函数。

source("script.R") # assuming script.R is in your working directory.

此函数将运行脚本而不在命令行中显示所有内容。

【讨论】:

谢谢。不幸的是,source("path/script.R") 阻止 sprintf() 在控制台中被披露。 @owner 这是故意的,sprintf 不应该打印到控制台。请改用message @KonradRudolph:我通常使用sprintf()strings 打印到控制台,至少在Matlab 中。仅供参考:message() 也可以工作,尽管可能会(在外观上)与 R default warnings 消息混淆。最好的, @owner 记录一下,sprintf 不打印字符串,fprintf 这样做,但是在 Matlab 中将分号从一行中删除会打印该行上的任何内容,但无论对你有用. @owner 你做错了。它恰好在特定情况下工作,但正如你在这里看到的,它不能可靠地工作。顺便说一句,Matlab 也是如此。 sprintf,尽管它的名字,是用于字符串格式化,而不是用于打印。

以上是关于防止 Rstudio 控制台显示脚本命令的主要内容,如果未能解决你的问题,请参考以下文章

R.003 Rstudio使用

R:在新的 Rstudio 预览版中安装 matplotlib

脚本从 R 运行,但不是通过命令行

RStudio 显示不同的 $PATH 变量

R语言基础:R与R包

R语言客户端RStudio快捷键大全