如何选择如何使用R打印?

时间:2016-03-17 15:38:53

标签: r

在R中显示文字的方法有很多种:catprintwritewriteLinessinkmessage和我现在还记不起的其他选择。在这里和互联网上的其他地方还有其他问题比较其中一些,但它们通常只涵盖两到三个。必须有一个表格或图表可用于简要总结所有这些之间的差异。是的,我检查了手册,但我无法区分大多数手册。

更新:在我发布这个问题之后,有一个非常类似的人得到了很好的答复:Why is message() a better choice than print() in R for writing a package?。由于这个问题已经结束,我无法将其标记为重复或添加答案,所以我只是留下这个问题。

1 个答案:

答案 0 :(得分:2)

这是一个很好的问题,因为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函数连接传递给它的所有条目,并以更类似于您可能更习惯的命令行或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函数很重要,包括它的堂兄paste0paste函数还会向控制台打印视觉上与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"

重要的是,根据理查德的评论,pastepaste0的输出可以保存为对象或在其他函数中使用,与cat不同。

x<-paste(tmp,c("one","two"),sep = "~")
x
# [1] "foo~one" "bar~two" "baz~one"

如果您尝试将printcat的输出保存到对象中,则以下是控制台输出:

> x<-print("yes")
[1] "yes"
> x
[1] "yes"
> x<-cat("yes")
yes
> x
NULL

大多数R初学者通常会遇到的另一个问题是在for循环中使用printpaste。在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功能可用于连接&#39;类型对象,以便将输出发送到其他地方,通常是文件。与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

您可以为此提供一些创造性用途,例如在脚本末尾创建系统会话日志

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