R 使用另一个脚本中的变量(文件间函数闭包)
我有脚本main.R,在这里我创建inv_cov_mat变量。稍后我加载metrics.R并使用它来计算函数值(我使用它作为脚本间函数闭包)。我收到错误“找不到对象“inv\u cov\u mat”。我的代码: main.R:R 使用另一个脚本中的变量(文件间函数闭包),r,R,我有脚本main.R,在这里我创建inv_cov_mat变量。稍后我加载metrics.R并使用它来计算函数值(我使用它作为脚本间函数闭包)。我收到错误“找不到对象“inv\u cov\u mat”。我的代码: main.R: knn <- function(...) { # some code source("./source/metrics.R") if (metric == "mahalanobis") inv_cov_mat <- solve(cov(tr
knn <- function(...)
{
# some code
source("./source/metrics.R")
if (metric == "mahalanobis")
inv_cov_mat <- solve(cov(training_set))
# other code
# calculate distance in given metric between current vector and every row vector from training set matrix
distances <- apply(training_set, 1, metric, vec2=curr_vec) # error
knn我发现了一个简单的,即使不是优雅的答案:使用inv_cov_mat作为全局变量,而不是在knn函数中。然后其他脚本可以看到它。我发现了一个简单的,即使不是优雅的答案:使用inv_cov_mat作为全局变量,而不是在knn函数中。然后其他脚本可以看到它。您想要什么还不完全清楚,但如果我理解正确的话——您有一个字符串,标识您想要使用的度量,还有一个同名函数。因此,您应该能够使用get
根据名称检索函数
metric==“马氏”
metric.fun=get(公制)
距离你想要什么还不完全清楚,但如果我理解正确的话——你有一个字符串来标识你想要使用的度量,还有一个同名的函数。因此,您应该能够使用get
根据名称检索函数
metric==“马氏”
metric.fun=get(公制)
距离您可以在马氏体中添加一个新参数以通过inv_cov_mat。另外,什么是
training_set`?我可以,但因为我选择了带有match.fun的度量函数(fun_作为_字符串),我必须创建嵌套的if构造,以使用除2个向量以外的度量(例如马氏体、标准欧几里德)。这将使我的代码更慢、更难看、更难维护。或者,您可能必须传递环境,以便函数检查正确环境中的对象。类似于我编辑我的问题来回答你关于训练集的问题。关于环境-我尝试在mahalanobis函数中使用get(“inv\u cov\u mat”,env=parent.frame(),inherits=TRUE)
,但由于某些原因,它找不到它。能否在mahalanobis中添加一个新参数以传递inv\u cov\u mat。另外,什么是
training_set`?我可以,但因为我选择了带有match.fun的度量函数(fun_作为_字符串),我必须创建嵌套的if构造,以使用除2个向量以外的度量(例如马氏体、标准欧几里德)。这将使我的代码更慢、更难看、更难维护。或者,您可能必须传递环境,以便函数检查正确环境中的对象。类似于我编辑我的问题来回答你关于训练集的问题。关于环境-我尝试在mahalanobis函数中使用get(“inv\u cov\u mat”,env=parent.frame(),inherits=TRUE)
,但由于某些原因它找不到它。我使用match.fun正确地获取函数。这没有问题,我只是在该度量函数中获取inv\u cov\u mat
时遇到问题。正如我在前面的注释中所描述的,传递变量在我的代码结构中是一个非常糟糕的主意(尽管我通常会这样做,但这只是现有代码的问题)。正如我在上一篇评论中所写的,get函数由于某些原因无法工作,但main.R中的全局变量可以工作。我使用match.fun正确地获取函数,这没有问题,我只是在该度量函数中获取inv\u cov\u mat
时遇到问题。正如我在前面的注释中所描述的,传递变量在我的代码结构中是一个非常糟糕的主意(尽管我通常会这样做,但这只是现有代码的问题)。正如我在上一篇评论中所写的,get函数由于某些原因不能工作,但main.R中的全局变量可以工作。
mahalanobis <- function(vec1, vec2)
{
diff <- vec1 - vec2
sqrt(t(diff) %*% inv_cov_mat %*% diff)
}