【问题标题】:Modify three lines of code in a function from an R package从 R 包中修改函数中的三行代码
【发布时间】:2023-04-10 06:08:01
【问题描述】:

来自 R 包 effects 的函数 Effect.lm() 有一个错误,可以通过添加 3 行代码来解决。

我有下面的解决方案,但是有没有办法从 R 包 effects 实现对 Effect.lm() 的更改?

我打算间接使用Effect.lm()(通过另一个函数),并且更改必须可以被其他用户复制。

ps。我认为this answer 可能是相关的。 不幸的是,正如他所提到的,@Ben Bolker 的答案(他的 R 代码)并没有达到我的上述目标。

library(effects)

# Delete line 164 in the following
View(effects::Effect.lm)

# Then, in its place, add the following 3 lines

  use <- !is.na(mod$coefficients)     # new
  mmat <- mod.matrix[, use]           # new
  if (any(is.na(V))) V <- V[use, use] # new

【问题讨论】:

  • 你联系维护者/提交问题了吗?我的回答解决了你的问题吗? (如果是,我们鼓励您接受它;如果不是,欢迎您评论/解释它为什么不起作用)

标签: r function package


【解决方案1】:

执行此操作的最简单方法是下载包源,适当地编辑源,然后运行R CMD INSTALL 以安装修改后的包。

如果您的工作流程只需要直接调用Effect.lm(即不通过其他包函数间接调用),那么您可以使用dump()将函数定义转储到文件中,编辑该文件,然后source()它。

有一些技巧涉及将函数的主体转换为字符向量,对其进行编辑和替换,例如

oldfun <- effects:::Effect.lm
## this is the 165th line of the *body*
replace_line <- 165
s <- deparse(body(oldfun))
new_lines <- c("use <- !is.na(mod$coefficients)",
               "mmat <- mod.matrix[, use]",
               "if (any(is.na(V))) { V <- V[use, use] } ")
s <- c(s[1:(replace_line-1)], new_lines, s[(replace_line+1):length(s)])
newfun <- oldfun
body(newfun) <- parse(text=s)

但这很聪明,也很脆弱,如果您尝试在包环境中替换该功能,将无法工作(或者,它可能会起作用,但只有在经过大量尝试之后才能使用解锁环境等)。

或者你可以给维护者发电子邮件并要求他们修复错误...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-20
    • 2018-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-22
    • 2012-01-15
    相关资源
    最近更新 更多