在R函数体中搜索特定行

在R函数体中搜索特定行,r,R,我希望在函数体的特定点“复制和修改”函数。目前,我所拥有的是 nearest_psd <- function(mat) { ed <- eigen(mat) eigvecs <- ed$vectors eigvals <- ed$values eigvals[eigvals<0] <- 0 eigvecs %*% diag(eigvals) %*% t(eigvecs) } nearest_pd <- nearest_psd

我希望在函数体的特定点“复制和修改”函数。目前,我所拥有的是

nearest_psd <- function(mat) {

  ed <- eigen(mat)
  eigvecs <- ed$vectors
  eigvals <- ed$values
  eigvals[eigvals<0] <- 0
  
  eigvecs %*% diag(eigvals) %*% t(eigvecs)
}

nearest_pd <- nearest_psd
formals(nearest_pd)$pdeps <- 1e-08
body(nearest_pd)[[c(7,3)]] <- quote(pdeps)

nearest_psd以下内容可能会满足您的需要


最近的_psd您可以使用
相同的
来比较两个表达式;这样,您就可以识别并替换有问题的表达式:

to_replace = vapply(body(nearest_pd), function (e) identical(e, quote(eigvals[eigvals < 0] <- 0)), logical(1L))
body(nearest_pd)[to_replace] = list(quote(eigvals[eigvals < pdeps] <- pdeps))

…不需要仅为了使用元编程。

理想情况下,您不会修改复制的函数,而是通过添加必要的参数修改原始函数,使其具有通用性。在您的情况下,硬编码并不是一个坏的解决方案——事实上,它本质上是必要的:否则您将如何防范代码中其他不可预测的更改?这是一个坏的解决方案:执行(脆弱的)字符串替换是一个完全不必要的概念性迂回,R允许纯粹使用符号修改来做同样的事情。此外,我强烈怀疑这个解决方案实际上是否比OP的硬编码替代方案更健壮。
nearest_pd <- function (mat, pdeps = 1e-08) {
    ed <- eigen(mat)
    eigvecs <- ed$vectors
    eigvals <- ed$values
    eigvals[eigvals < pdeps] <- pdeps
    eigvecs %*% diag(eigvals) %*% t(eigvecs)
}