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 (反之亦然)?
情侣快速评论:
-
path
/usr/local/bin/r
是任意的,你可以使用/usr/bin/env r
和我们在一些例子中一样。 我记得,它限制了你可以给r
其他参数,因为当通过env
调用时只需要一个参数 -
我不明白你的基准,为什么你这样做。 我们确实在源代码中进行了时间比较,参见
tests/timing.sh
和tests/timing2.sh
。 也许你想分开启动和graphics创build之间的testing,或者你之后的任何事情。 -
每当我们进行这些testing时,小生就赢了。 (当我重新运行这些程序的时候,它仍然赢了)。对我们来说这是有道理的,因为如果你看看
Rscript.exe
的源Rscript.exe
,它的工作原理是通过设置环境和一个命令string,然后最终调用execv(cmd, av)
。 小鱼可以开始更快一点。 -
主要的价格是便携性。 littler的构build方式,它不会让它到Windows。 或者至less不容易。 OTOH我们有RInside移植,所以如果有人真的想…
-
Littler在2006年9月首次出现,而Rscript在2007年4月与R 2.5.0一起出现。
-
Rs到处都是Rs。 这是一个很大的优势。
-
在我看来,命令行选项更适合小生意人。
-
这两个工作与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(一个印刷品和一个图),所以我期望没什么区别。