R memoise в файловую систему с неидентичным условием соответствия

Я хотел бы использовать пакет memoise с cache_filesystem для кэширования долго работающих функций для использования в блестящем приложении. Это почти отлично работает, проблема в том, что вход представляет собой объект списка, который содержит (среди прочего) соединение с базой данных, которое будет меняться. Я хочу игнорировать этот элемент в моем объекте ввода.

Соединение с БД будет меняться от сеанса к сеансу, но мне нужно, чтобы memoise смотрел только элемент id во входных данных, а не другие элементы в списке. Есть ли способ сделать это? Я просмотрел аргумент ..., но он, кажется, только еще больше ограничивает, а не расслабляет.

Упрощенный пример ниже:

localCache = cache_filesystem("memoiseCache/")
input1_1 = list(id = "id1", dbConn = 100)
input1_2 = list(id = "id1", dbConn = 101)

testFun=function(input) {
  print("Running the function")
  return(100)
}
library(memoise)
testFun.mem = memoise(testFun)

# This will run the function for the initial time - CORRECT
> testFun.mem(input1_1)
[1] "Running the function"
[1] 100

# This will now fetch the cached result - CORRECT
> testFun.mem(input1_1)
[1] 100

# I need this to ignore the dbConn element and instead fetch the cached result
> testFun.mem(input1_2)
[1] "Running the function"
[1] 100

РЕДАКТИРОВАТЬ: Входные данные для моей функции фактически указывают на статическую БД, поэтому нет проблем с кэшированием результатов, на которую указывает статическая БД, определяется элементом id, но могут быть установлены разные подключения к та же БД. Функции могут быть сколь угодно сложными. Например:

function(dbInputObj){
  <Many table joins and aggregations>
  <Some logic and conditions>
  <More table joins>
  return(result)
}

person Martin Watts    schedule 02.10.2017    source источник


Ответы (1)


Вы можете написать функцию-оболочку, чтобы скрыть различия. Я не вижу, как ваше приложение работает из упрощенного кода.

Вы подключаетесь к одной и той же базе данных с разными dbConn? Вы пытаетесь кэшировать запрос к базе данных или какой-то расчет после запроса к базе данных?

Я не думаю, что это хорошая идея кэшировать запрос к базе данных, если dbConn может быть другим. Вы должны получать обновленные данные из базы данных, а не кэшировать их.

Если вы хотите кэшировать расчет после запроса к базе данных, просто сначала получите значение, а затем запомните функцию расчета только со значениями, а не с подключением к базе данных.

person dracodoc    schedule 18.10.2017
comment
Спасибо за ответ - я отредактировал вопрос с дополнительной информацией. Поскольку я хочу, чтобы функции были произвольно сложными, я не могу придумать способ сделать это, не скрывая некоторые элементы списка ввода от memoise - что может быть невозможно? - person Martin Watts; 19.10.2017
comment
Я все еще думаю, что более логично кэшировать в конце базы данных, хотя вы можете использовать простой хак (на самом деле не рекомендуется в концепции): получить dbConn как переменную, написать функцию, которая принимает dbConn как глобальную переменную вместо параметра. Это нарушает несколько предположений о memoise, но может сработать в вашем случае. - person dracodoc; 19.10.2017