Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 使用另一个脚本中的变量(文件间函数闭包)_R - Fatal编程技术网

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

我有脚本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(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)
}