Использование переменной из другого скрипта (закрытие межфайловой функции) - PullRequest
1 голос
/ 22 июня 2019

У меня есть скрипт 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)
}

Ответы [ 2 ]

0 голосов
/ 22 июня 2019

Не совсем понятно, что вы хотите, но если я вас правильно понимаю - у вас есть строка символов, идентифицирующая метрику, которую вы хотите использовать, и функция с тем же именем.Таким образом, вы должны иметь возможность использовать get для извлечения функции на основе имени.

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

Тем не менее, возможно, существуют более эффективные способы организации кода, позволяющие полностью избежать этой проблемы, например, создатьименованный список функций для доступа к метрикам.

РЕДАКТИРОВАТЬ относительно проблемы inv_cov_mat, либо передайте ее в качестве аргумента вашей метрической функции, либо используйте get внутри эта функция для доступа к переменным из родительской среды с использованием аргумента envir.Передача переменной в качестве аргумента метрической функции, безусловно, является лучшим и более чистым подходом.

0 голосов
/ 22 июня 2019

Я нашел простой, даже если не элегантный ответ: используйте inv_cov_mat в качестве глобальной переменной, а не внутри функции knn. Тогда другие сценарии смогут увидеть это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...