[分享] 修改既有的R function内容

楼主: Wush978 (拒看低质媒体)   2018-03-07 17:40:18
[关键字]: R, debug
好读版:
http://wush.ghost.io/trace/
今天为了追一个安装套件的bug,我需要追踪`tools:::.install_packages`这个程式码在
`if (test_load) {`以后的行为。
在追踪R语言函数的行为时,我常用的是在原始码中插入`browser()`与
`debug(tools:::.install_packages)`两种方法。`trace`函式我一直不太懂。有兴趣的
读者可以在查阅我过去写的:[R的除错功能](http://wush.ghost.io/r-debug/)
在追`tools:::.install_packages`这个函数时,一来我懒的去研究如何修改`tools`这个
内建套件的函数原始码,二来这个函数很复杂,如果用`debug`需要疯狂的next step...
`trace`这个函数,是用来编辑已经存在的R函数。第一种用法是直接在指定的行数插入给
定的expression。这里的行数,是以`list(body(tools:::.install_packages))`的输出
为准。有兴趣的读者直接查阅`examples(trace)`就可以看到范例了。
另外一种作法,是直接设定`edit = TRUE`,R就会打开默认的编辑器(效果应该等同于
`file.edit`)后,让我们直接编辑原始码,储存退出后生效。以我手上的例子,我需要输
入:`trace(".install_packages, where = loadNamespace("tools"), edit = TRUE)`。
以下的附加说明是写给没这么熟R套件系统的读者。`tools:::.install_packages`是
tools套件的内部函数(有三个`:`),所以即使我`library(tools)`之后,直接在console
输入`.install_packages`,R仍然会回报错误:找不到`.install_packages`物件。因此
我需要指定`where`参数,告诉R`.install_packages`在哪里。`tools`套件的内部函数,
在R中是放在`<environment: namespace:tools>`这个环境中,我们可以使用
`loadNamespace("tools")`的输出来取得这个环境。
输入以后,我就可以手动编辑原始码,直接找到`test_load`这段程式之后,在下一行插
入`browser()`,就可以在执行`tools:::.install_packages`时直接中断在我要的地方。

Links booklink

Contact Us: admin [ a t ] ucptt.com