专业的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软件包