...除了在脚本文件的第一行中用#!/usr/bin/env Rscript littler #!/usr/local/bin/r调用 R脚本外(在我的系统上)。我发现执行速度有些差异(好像littler有点慢)。

我创建了两个虚拟脚本,每个虚拟脚本运行了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)

这是littler文件:
#!/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中。我创建了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而不是Rscript,反之亦然?

最佳答案

情侣快速评论:

  • 路径/usr/local/bin/r是任意的,您可以像在某些示例中一样使用/usr/bin/env r。我记得,它限制了您可以给r提供的其他参数,因为通过env调用时仅需要一个参数
  • 我不了解您的基准测试,以及为什么要那样做。我们在源中确实有时序比较,请参阅tests/timing.shtests/timing2.sh。也许您想在启动和图形创建之间进行测试,或者进行其他操作。
  • 每当我们运行那些测试时,Littler都会赢。 (当我立即重新运行这些命令时,它仍然会赢。)这对我们来说很有意义,因为如果您查看Rscript.exe的源代码,则它会通过设置环境和命令字符串(最终调用execv(cmd, av))而起作用。 littler可以更快地开始。
  • 主要价格是便携性。 littler的构建方式,不会在Windows中实现。或至少不容易。 OTOH我们已经将RInside移植了,所以如果有人真的想...
  • Littler在2006年9月排名第一,而Rscript在2007年4月随R 2.5.0一起发布。
  • Rscript现在无处不在R。那是一个很大的优势。
  • 在我看来,命令行选项对于一点点子来说比较明智。
  • 都可与CRAN包getopt和optparse一起使用以进行选项解析。

  • 因此,这是个人喜好。我共同撰写了littler,做了很多事情(例如,对于RInside),但仍然发现它很有用-因此我每天都要使用数十次。它驱动蔓越莓。它驱动cran2deb。嘿,您的里程可能会有所不同。

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

    后记:我会把测试写成

    我会写成这样
      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)
    

    摆脱异常值。而且,您实际上仅测量了两者都将从R库获得的I / O(打印和打印),因此我希望两者之间的差异不大。

    10-07 17:02