【问题标题】:Using variable from another script (inter-file function closure)使用来自另一个脚本的变量(文件间函数闭包)
【发布时间】:2019-11-05 01:52:32
【问题描述】:

我有脚本 main.R,我在其中创建 inv_cov_mat 变量。我稍后加载metrics.R并用它来计算函数值(我用它作为一种脚本间函数闭包)。我收到错误“找不到对象'inv_cov_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

metrics.R:

mahalanobis <- function(vec1, vec2)
{
  diff <- vec1 - vec2
  sqrt(t(diff) %*% inv_cov_mat %*% diff)
}

【问题讨论】:

  • 你能在mahalanobis to pass the inv_cov_mat. Also, what is training_set`中添加一个新参数吗?
  • 我可以,但因为我选择了带有 match.fun(fun_as_string) 的度量函数,我必须创建嵌套的 if 构造来使用需要 2 个向量之外的东西的度量(例如 Mahalanobis,标准化欧几里得)。这会让我的代码变得更慢、更丑、更难维护。
  • 或者您可能必须传递环境,以便函数在正确的环境中检查对象。类似于here
  • 我编辑了我的问题来回答您关于 training_set 的问题。关于环境 - 我尝试在 mahalanobis 函数中使用get("inv_cov_mat", env=parent.frame(), inherits=TRUE),但由于某种原因找不到它。

标签: r


【解决方案1】:

我找到了简单的,即使不是优雅的答案:使用 inv_cov_mat 作为全局变量,而不是在 knn 函数中。然后其他脚本就可以看到了。

【讨论】:

    【解决方案2】:

    你想要什么并不完全清楚,但如果我理解正确的话——你有一个字符串来标识你想要使用的指标,以及一个同名的函数。所以你应该可以使用get根据名字来检索函数。

    metric == "mahalanobis"
    metric.fun = get(metric)
    distances <- apply(training_set, 1, metric.fun, vec2=curr_vec)
    

    也就是说,可能有更好的方法来组织您的代码,从而完全避免这个问题,例如创建用于访问指标的命名函数列表。

    编辑关于inv_cov_mat 的问题,要么将其作为参数传递给您的度量函数,要么使用get inside 该函数从父级访问变量使用envir 参数的环境。将变量作为参数传递给度量函数绝对是更好、更简洁的方法。

    【讨论】:

    • 我可以使用 match.fun 正确获取函数,这没问题,我只是在该度量函数中获取 inv_cov_mat 时遇到问题。正如我之前在评论中所描述的那样,传递变量在我的代码结构中是一个非常糟糕的主意(尽管我通常会这样做,但这只是现有代码的问题)。正如我在上一条评论中所写,get 函数由于某种原因不起作用,但 main.R 中的全局变量有效。
    猜你喜欢
    • 2019-01-08
    • 2019-06-27
    • 2021-03-28
    • 2011-08-01
    • 1970-01-01
    • 2016-06-01
    • 1970-01-01
    • 2012-09-13
    • 1970-01-01
    相关资源
    最近更新 更多