在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)
}