专业的R开发者应该拥有哪些核心软件包,为什么?

什么是特定的实用程序,可以帮助R开发人员更有效地编码和debugging?

我期待build立一个R开发环境,并且希望能够概括一下在构build代码覆盖,debugging,生成包文件和帮助文件以及UMLbuild模的unit testing基础架构时对我有用的工具。

注意:请根据您推荐的工具的经验和理由,举例说明您的答案。 不要只是链接

有关

  • R的Windows文本编辑器的build议
  • Linux中有哪些IDE可用于R?
  • 通常用于编程的工具

我已经写了太多的软件包,为了保持可pipe理性,我已经在基础架构软件包中投入了大量时间:这些软件包帮助我使代码更加健壮,使其他人更容易使用。 这些包括:

  • roxygen2 (与Manuel Eugster和Peter Danenberg合作),它允许您将文档保留在它所logging的function旁边,这使得我更有可能保持它的最新状态。 roxygen2还有一些新function,旨在最大限度地减less文档重复:模板( @template ),参数inheritance( @inheritParams )和函数族( @family )等等。

  • testthat自动化我的代码的testing。 这越来越重要,因为我的代码越来越less:自动化testing记住函数应该如何工作,即使我不这样做。

  • devtools自动执行许多常见的开发任务(如Andrie提到的)。 devtools的最终目标是使其像R CMD check那样在后台连续运行,并通知您实例出现问题。

  • profr ,特别是未发布的交互式资源pipe理器 ,使我很容易find我的代码中的瓶颈。

  • helpr (Barret Schloerke)即将推出http://had.co.nz/ggplot2 ,为R文档提供了一个优雅的html界面。

有用的Rfunction:

  • apropos :我总是忘记有用function的名称, apropos帮助我find它们,即使我只记得一个片段

R之外:

  • 我使用textmate编辑R(和其他)文件,但我不认为这真的很重要。 挑一个,学习所有的angular落和缝隙。

  • 花一些时间来学习命令行。 任何你可以做的事情来自动化你的工作stream程的任何部分将长期得到回报。 从命令行运行R会导致一个自然的过程,每个项目都有自己的R实例; 我经常有2-5个R实例在运行。

  • 使用版本控制。 我喜欢git和github 。 同样,你使用哪个系统并不重要,但掌握它!

我希望R的东西有:

  • 代码覆盖工具
  • 像rake或jake这样的依赖pipe理框架
  • 更好的内存分析工具
  • 用于描述dataframe(和其他数据源)的元数据标准
  • 更好的工具来描述和呈现各种输出格式的表格
  • 用于降价呈现的包

我记得之前已经问过这个问题了,我的答案是一样的:Emacs。

Emacs可以

  • 通过ESS ,你可以做任何你想做的事情
    • 代码执行各种片段(线,区域,函数,缓冲区…)
    • 检查工作区,
    • 显示variables,
    • 多个R会话,并在他们之间轻松切换
    • 转录模式重新运行(部分)以前的会话
    • 访问帮助系统
    • 以及更多
  • 可以通过AucTex模式轻松处理Latex,这有助于Sweave for R
  • 有其他与R结合的编程语言的模式,无论是C / C ++,Python,shell,SQL,…都包含自动缩进和颜色突出显示
  • 可以使用sql- *模式访问数据库
  • 可以使用tramp模式远程工作:访问远程文件(就像使用ssh / scp一样)
  • 可以作为一个守护进程运行,这使得它有状态,所以你可以重新连接到相同的Emacs会话,无论是在X11(或等效)的工作站上,或通过ssh(有或没有X11)或屏幕远程。
  • 有组织模式 ,与babel一起,提供了一个强大的sweave替代scheme, 在本文中讨论讨论(社会)科学家的工作stream应用程序
  • 可以通过Mx shell和/或Mx eshell运行一个shell,在dired模式下具有很好的目录访问function,具有远程访问的ssh模式
  • 通过特定的模式轻松地连接所有的源代码库(例如svn的psvn)
  • 像R一样是跨平台的,所以你在所有相关的操作系统上都有类似的用户界面体验
  • 被广泛使用,被广泛使用,并且正在为代码和扩展进行积极的开发,请参阅后面的emacswiki.org网站
  • <tongueInCheek>不是Eclipse,不需要Java </tongueInCheek>

您当然可以将其与您喜欢的任何CRAN软件包结合使用:RUnit或testthat,不同的分析支持包,debugging软件包,…

其他有用的工具:

  • R CMD check确实是你的朋友,因为这是CRAN用来决定你是“进出”的。 使用它并相信它
  • tests/目录可以提供一个简化版本的unit testing,通过保存与输出(从之前的R CMD check运行)进行比较,这是有用的,但适当的unit testing更好
  • 特别是对于包含目标代码的包,我更喜欢启动新鲜的R会话,而且更简单: r -lfoo -e'bar(1, "ab")'启动R会话,加载foo包并评估给定的expression式这里有一个带有两个参数的函数bar() )。 这与R CMD INSTALL结合,提供了一个完整的testing周期。

知识和能够使用基本的Rdebugging工具是学习快速debuggingR代码的重要的第一步。 如果您知道如何使用基本工具,则可以在任何地方debugging代码,而无需使用附加软件包中提供的所有额外工具。

traceback()允许你看到导致错误的调用栈

 foo <- function(x) { d <- bar(x) x[1] } bar <- function(x) { stopifnot(is.matrix(x)) dim(x) } foo(1:10) traceback() 

收益率:

 > foo(1:10) Error: is.matrix(x) is not TRUE > traceback() 4: stop(paste(ch, " is not ", if (length(r) > 1L) "all ", "TRUE", sep = ""), call. = FALSE) 3: stopifnot(is.matrix(x)) 2: bar(x) 1: foo(1:10) 

所以我们可以清楚地看到在函数bar()发生了错误; 我们已经缩小了寻找bug的范围。 但是如果代码产生警告而不是错误? 这可以通过warn选项将警告转换为错误来处理:

 options(warn = 2) 

会将警告转化为错误。 然后可以使用traceback()来追踪它们。

链接到这是得到R从代码中的错误恢复,所以你可以debugging出了什么问题。 options(error = recover)将使我们进入debugging器框架:

 > options(error = recover) > foo(1:10) Error: is.matrix(x) is not TRUE Enter a frame number, or 0 to exit 1: foo(1:10) 2: bar(x) 3: stopifnot(is.matrix(x)) Selection: 2 Called from: bar(x) Browse[1]> x [1] 1 2 3 4 5 6 7 8 9 10 Browse[1]> is.matrix(x) [1] FALSE 

你可以看到我们可以放到调用堆栈的每一帧中,看看函数是如何被调用的,参数是什么等等。在上面的例子中,我们看到bar()传递了一个不是matrix的向量,因此是错误的。 options(error = NULL)将此行为重置为正常。

另一个关键函数是trace() ,它允许您将debugging调用插入到现有函数中。 这样做的好处是,您可以告诉R从源代码中的特定行进行debugging:

 > x <- 1:10; y <- rnorm(10) > trace(lm, tracer = browser, at = 10) ## debug from line 10 of the source Tracing function "lm" in package "stats" [1] "lm" > lm(y ~ x) Tracing lm(y ~ x) step 10 Called from: eval(expr, envir, enclos) Browse[1]> n ## must press n <return> to get the next line step debug: mf <- eval(mf, parent.frame()) Browse[2]> debug: if (method == "model.frame") return(mf) else if (method != "qr") warning(gettextf("method = '%s' is not supported. Using 'qr'", method), domain = NA) Browse[2]> debug: if (method != "qr") warning(gettextf("method = '%s' is not supported. Using 'qr'", method), domain = NA) Browse[2]> debug: NULL Browse[2]> Q > untrace(lm) Untracing function "lm" in package "stats" 

这使您可以在代码中的正确位置插入debugging调用,而无需逐步执行后续函数调用。

如果你想在执行时逐步执行一个函数,那么debug(foo)会打开foo()函数的debugging器,而undebug(foo)将closuresdebugging器。

关于这些选项的一个关键点是,我不需要修改/编辑任何源代码来插入debugging调用等。我可以尝试一下,看看发生错误的会话直接发生了什么问题。

有关在R中进行不同的debugging,请参阅CRAN上的Mark Bravington debugging软件包