Rscript和littler之间的区别

…除了Rscript#!/usr/bin/env Rscript脚本文件的第一行用#!/usr/bin/env Rscript#!/usr/bin/env Rscript#!/usr/local/bin/r (在我的系统上)调用。 我发现在执行速度方面有一定的差异(看起来像小鱼慢一点)。

我创build了两个虚拟脚本,每运行1000次,比较平均执行时间。

这是Rscript文件:

 #!/usr/bin/env Rscript btime <- proc.time() x <- rnorm(100) print(x) print(plot(x)) etime <- proc.time() tm <- etime - btime sink(file = "rscript.r.out", append = TRUE) cat(paste(tm[1:3], collapse = ";"), "\n") sink() print(tm) 

这里是小文件:

 #!/usr/local/bin/r btime <- proc.time() x <- rnorm(100) print(x) print(plot(x)) etime <- proc.time() tm <- etime - btime sink(file = "little.r.out", append = TRUE) cat(paste(tm[1:3], collapse = ";"), "\n") sink() print(tm) 

正如你所看到的,它们几乎是相同的(第一行和汇文件参数不同)。 输出sink到文本文件,因此用read.table导入到R中。 我创build了bash脚本来执行每个脚本1000次,然后计算平均值。

这是bash脚本:

 for i in `seq 1000` do ./$1 echo "####################" echo "Iteration #$i" echo "####################" done 

结果是:

 # littler script > mean(lit) user system elapsed 0.489327 0.035458 0.588647 > sapply(lit, median) L1 L2 L3 0.490 0.036 0.609 # Rscript > mean(rsc) user system elapsed 0.219334 0.008042 0.274017 > sapply(rsc, median) R1 R2 R3 0.220 0.007 0.258 

长话短说:旁边(显而易见)的执行时间差异,是否还有一些其他的区别? 更重要的问题是:为什么你应该/不应该更喜欢Rscript (反之亦然)?

情侣快速评论:

  1. path/usr/local/bin/r是任意的,你可以使用/usr/bin/env r和我们在一些例子中一样。 我记得,它限制了你可以给r其他参数,因为当通过env调用时只需要一个参数

  2. 我不明白你的基准,为什么你这样做。 我们确实在源代码中进行了时间比较,参见tests/timing.shtests/timing2.sh 。 也许你想分开启动和graphics创build之间的testing,或者你之后的任何事情。

  3. 每当我们进行这些testing时,小生就赢了。 (当我重新运行这些程序的时候,它仍然赢了)。对我们来说这是有道理的,因为如果你看看Rscript.exe的源Rscript.exe ,它的工作原理是通过设置环境和一个命令string,然后最终调用execv(cmd, av) 。 小鱼可以开始更快一点。

  4. 主要的价格是便携性。 littler的构build方式,它不会让它到Windows。 或者至less不容易。 OTOH我们有RInside移植,所以如果有人真的想…

  5. Littler在2006年9月首次出现,而Rscript在2007年4月与R 2.5.0一起出现。

  6. Rs到处都是Rs。 这是一个很大的优势。

  7. 在我看来,命令行选项更适合小生意人。

  8. 这两个工作与CRAN包getopt和optparse选项分析。

所以这是个人喜好。 我曾经写过一篇文章,经常学到很多东西(比如说里德赛德),但是仍然觉得它很有用,所以我每天都用它几十次。 它驱动CRANberries。 它驱动cran2deb。 正如你所说,你的里程可能会有所不同。

免责声明:littler是我的项目之一。

Postscriptum :我会写testing

我会写这个

  fun <- function { X <- rnorm(100); print(x); print(plot(x)) } replicate(N, system.time( fun )["elapsed"]) 

甚至

  mean( replicate(N, system.time(fun)["elapsed"]), trim=0.05) 

摆脱exception值。 而且,你基本上只能测量从R库中得到的I / O(一个印刷品和一个图),所以我期望没什么区别。