我在安装R软件包(unable to move temporary file
)时出错,但是可以通过编辑utils:::unpackPkgZip
来增加两次解压缩之间的时间来解决此问题,即
trace(utils:::unpackPkgZip, edit = TRUE)
然后在第142行增加
Sys.sleep(0.5)
至2.5。我的问题是,是否有一种方法可以在启动时自动执行此操作,或者只是完全更改功能,因此我不必在每个会话中都重复此操作。
我试图放
unlockBinding("unpackPkgZip", getNamespace("utils"))
utils::assignInNamespace("unpackPkgZip", new_fct, "utils", getNamespace("utils"))
lockBinding("unpackPkgZip", getNamespace("utils"))
在我的.Rprofile的new_fct
函数中,.First()
是值已更改的函数,但随后我得到了
Error in utils::assignInNamespace("unpackPkgZip", function(pkg, pkgname, :
locked binding of ‘unpackPkgZip’ cannot be changed
我认为这是因为.First()
在.First.sys()
之前执行
编辑:我刚刚意识到,assignInNamespace
本身就是这样
if (ns_name %in% tools:::.get_standard_package_names()$base)
stop("locked binding of ", sQuote(x), " cannot be changed",
domain = NA)
所以我想不可能。
答案 0 :(得分:0)
您不需要修改函数本身,
您可以使用其at
参数让跟踪在指定的行执行代码。
其文档指出:
提供
at
参数时,它可以是整数的向量,表示函数主体的子步骤(仅当函数主体包含在{...}中时,此方法才有效) 。在这种情况下,不会在进入时调用tracer,而是在评估at中列出的每个步骤之前调用它。 (提示:您不想尝试计算函数的打印版本中的步骤;而是查看as.list(body(f))以获得与函数f中的步骤相关的数字。)>
以cat
为例:
as.list(body(cat))
[[1]]
`{`
[[2]]
if (is.character(file)) if (file == "") file <- stdout() else if (substring(file,
1L, 1L) == "|") {
file <- pipe(substring(file, 2L), "w")
on.exit(close(file))
} else {
file <- file(file, ifelse(append, "a", "w"))
on.exit(close(file))
}
[[3]]
.Internal(cat(list(...), file, sep, fill, labels, append))
默认行为:
system.time(cat("I'm fast\n"))
I'm fast
user system elapsed
0 0 0
现在已注入代码:
trace(cat, quote(Sys.sleep(2)), at=3L, print=FALSE)
system.time(cat("now I'm slow\n"))
now I'm slow
user system elapsed
0.008 0.000 2.001