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

Я хотел бы использовать 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)
}

1 ответ

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

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

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

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

Другие вопросы по тегам