R更改基本包功能

时间:2018-07-27 08:21:50

标签: r

我在安装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)

所以我想不可能。

1 个答案:

答案 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