关闭。这个问题需要更多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/