r - 我应该如何选择如何使用 R 打印?

标签 r

关闭。这个问题需要更多focused .它目前不接受答案。












想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post .

5年前关闭。




Improve this question




在 R 中有多种显示文本的方式:cat , print , write , writeLines , sink , message ,以及我现在不记得的其他替代方案。这里和互联网上的其他地方还有其他问题比较其中一些,但它们通常只涵盖两三个。某处必须有可用的表格或图表来简要总结所有这些之间的差异。是的,我查看了手册,但我无法分辨出它们中的大多数之间的区别。

更新:在我发布这个问题后,其他人提出了一个非常相似的问题,得到了很好的回应:Why is message() a better choice than print() in R for writing a package? .由于此问题已关闭,我无法将其标记为重复或添加答案,因此我只留下此注释。

最佳答案

这是一个很好的问题,因为 R 因使用许多略有不同的方法来完成类似任务而臭名昭著。

函数print用于简单地打印到 R 控制台。例如:

# a sample vector
tmp<-c("foo","bar","baz")
tmp
# [1] "foo" "bar" "baz"

print(tmp)
#[1] "foo" "bar" "baz"

还值得注意的是print加载其他包后可以获得新的打印方式,例如xtable包裹。
cat function 连接传递给它的所有条目,并以更类似于您可能更习惯的命令行或 shell(例如 bash)的方式打印它们。例如:
cat(tmp)
# foo bar baz

喜欢 paste函数,它还可以包含分隔符,并允许 R 使用其他技巧:
cat(tmp,sep = "|")
# foo|bar|baz
# handy for creating complex regular expressions

# create some LaTeX markup
FigureFilepath<-"/path/to/figure/i.jpg"
cat("\\includegraphics[width=0.9\\linewidth,height=0.9\\textheight,keepaspectratio]{", FigureFilepath, "}\n", sep="")
# \includegraphics[width=0.9\linewidth,height=0.9\textheight,keepaspectratio]{/path/to/figure/i.jpg}

正如暗示的那样,如果您在具有 knitr 的 LaTeX 文档等环境中使用 R,这会很方便。并且想要打印特殊格式的文本。
write函数是 cat 的包装器,它打印到文件并对矩阵进行一些特殊处理(此处未显示):
write(tmp,file = "output.txt")
file.show("output.txt")
# foo
# bar
# baz

虽然 OP 没有提到它,但我认为提到 paste 很重要。函数,包括它的表亲 paste0 . paste函数还将项目打印到控制台,这些项目在视觉上看起来类似于 print ,例如:
paste(tmp)
# [1] "foo" "bar" "baz"

但是,存在一些显着差异。您还可以组合来自不同向量的元素,并指定分隔符:
paste(tmp,c("one","two"),sep = "~")
# [1] "foo~one" "bar~two" "baz~one"
# Note how the second element is recycled here!

您也可以collapse将所有内容与另一个指定的分隔符连接在一起的输出:
paste(tmp,c("one","two"),sep = "~",collapse = "|")
# [1] "foo~one|bar~two|baz~one"

如果你只是想要一个快速简单的,你可以使用 paste0不使用分隔符,但也可以支持 collapse .
paste0(tmp,c("one","two"))
# [1] "fooone" "bartwo" "bazone"

重要的是,paste 的输出和 paste0可以保存为对象或在另一个函数中使用,不像 cat根据理查德的评论。
x<-paste(tmp,c("one","two"),sep = "~")
x
# [1] "foo~one" "bar~two" "baz~one"

如果您尝试保存 print 的输出,这是控制台输出或 cat成一个对象:
> x<-print("yes")
[1] "yes"
> x
[1] "yes"
> x<-cat("yes")
yes
> x
NULL

大多数R初学者通常会遇到的另一个症结是print的用法。和 paste在 for 循环中。 paste的控制台输出在 for 中执行时不显示循环,如下所示:
for(i in 1){
  paste("This is paste")
  print("This is print")
  cat("This is cat")
}
# [1] "This is print"
# This is cat
sink函数只是将 R 控制台输出转移到一个文件中。
sink("output.txt")
cat("hello")
cat("\n")
cat("world")
print(tmp)
sink()
# hello
# world[1] "foo" "bar" "baz"

请注意,在两者之间写入控制台的任何内容 sink()命令将被写入文件,这可能是不可取的。
writeLines函数可以与“连接”类型对象一起使用,以便将输出发送到其他地方,通常是发送到文件。不像 sink ,它只会将指定的项目写入文件。
fileConn<-file("output.txt")
writeLines(tmp,fileConn)
cat("This is test text")
print("Hello world")
close(fileConn)
file.show("output.txt")
# foo
# bar
# baz

您可以为此想出一些创造性的用途,例如在脚本末尾创建系统 session 日志
fileConn<-file("syslog.txt")
writeLines(capture.output(system('uname -srv',intern=T),sessionInfo()), fileConn)
close(fileConn)
# file.show("syslog.txt")
# <too long to fit here!>

有一些很好的解释为什么其中一些函数在这个博客中也是如此工作的原因:http://arrgh.tim-smith.us/atomic.html

关于r - 我应该如何选择如何使用 R 打印?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36065232/

相关文章:

r - 避免来自 ifelse() 的 FALSE 部分的警告

r - 将绘图窗口扩展到 ggplot 中 x 轴标签之外

r - 哪个是 'right' 与 R 中的 'left' 滚动平均值?

R 计数字符列

r - 对同一数据框中共享除两个观察值以外的所有观察值的行求和

R:with()函数内的 Debug模式

r - 如何在 knitr 中安装软件包?

r - 将数据框列表转换为具有 id 列的单个数据框

r - 使用ggplot为 map 上不同的相邻区域着色

r - R 中是否有等效的 ast.literal_eval python 方法