Есть ли способ изменить абсолютный путь входов file_in на drake без аннулирования последующих целей?

Для моего проекта иногда требуется реструктуризация или просто изменение точки монтирования каталога данных моего проекта (например, обновление до catalina и отсутствие нестандартных подкаталогов /).

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

Есть ли способ этого избежать?


person Matthew Strasiotto    schedule 12.12.2019    source источник


Ответы (1)


Моя основная рекомендация здесь - использовать относительные пути вместо абсолютных. Если вы когда-либо использовали пакет here, это та же идея. Но вместо того, чтобы писать file.path(here::here(), "path/to/file.txt"), я рекомендую записать file_in("path/to/file.txt") в плане, предполагая, что вы собираетесь вызвать drake::make(), когда ваш рабочий каталог - path.

Это на будущее. В вашей текущей ситуации прямо сейчас, если вы абсолютно уверены, что все файлы обновлены, и вы не хотите тратить время на восстановление целевых объектов, вы можете использовать make(plan, trigger = trigger(command = FALSE, file = FALSE), чтобы указать drake перестать беспокоиться о том, изменятся ли команды или файлы. (Почему команды? Потому что там будут file_in() вызовы, и я предполагаю, что вы меняете пути внутри.)

Редактировать

Теперь я понимаю, что не полностью понял ваш вопрос в первый раз. Но поскольку я работаю с данными так же, как и вы, думаю, ответ есть. Допустим, у вас есть такой план:

plan <- drake_plan(
  data = get_data(file_in("DRIVE_NAME/file.db"))
)

И ваша точка монтирования изменится, и она будет выглядеть так:

plan <- drake_plan(
  data = get_data(file_in("DIFFERENT_MOUNT_POINT/file.db"))
)

Как вы отметили, борьба идет на этом меняющемся пути. Здесь вы можете вручную отслеживать файл с помощью триггера «изменить» < / а>. Таким образом, нам не понадобится file_in(). Во-вторых, используйте ignore() вокруг изменяющегося пути, чтобы drake считал, что команда осталась прежней. Нет лишнего аннулирования при изменении точек монтирования.

plan <- drake_plan(
  data = target(
    get_data(ignore("WHATEVER_MOUNT_POINT/file.db")),
    trigger = trigger(change = file.mtime("WHATEVER_MOUNT_POINT/file.db"))
  ) 
)

Теперь, когда изменяется время модификации, данные становятся недействительными. Но вы можете изменить WHATEVER_MOUNT_POINT без признания его недействительным. Обычно я бы выбрал хэш файла для триггера (это то, что file_in() говорит drake делать в качестве последнего результата), но я выбрал для вас отметку времени, потому что file.mtime() работает быстро, ваши данные большие и почти никогда не меняются.

person landau    schedule 12.12.2019
comment
Будет ли это предложение работать с символическими / жесткими ссылками? Я работаю с конфиденциальными данными с ограниченным хранением, требуемым этикой, поэтому предполагается, что они будут храниться извне, а это означает, что я не могу физически хранить их относительно рабочего каталога проекта. Кроме того, спасибо за предложение file, в целом я думаю, что это, вероятно, ускорит мой рабочий процесс, поскольку мои исходные данные редко меняются и составляют порядка 60 ГБ. Будет ли добавление необязательного prefix аргумента к file_in, общего для всех вводимых данных (или от file_prefix к _5 _ / _ 6_), является функцией, которую вы бы рассмотрели? - person Matthew Strasiotto; 13.12.2019
comment
Да, я также работаю с конфиденциальными / ограниченными данными, которые жестко заблокированы и редко меняются. file_in() на локальной символической ссылке стоит попробовать, но я сам не пробовал. Я не хочу реализовывать префикс, отдача кажется небольшой даже в таких ситуациях, как наша. Отредактирую ответ другим предложением ... - person landau; 13.12.2019
comment
См. Редактирование выше. Я думаю, он делает то, что вам нужно. - person landau; 13.12.2019
comment
Спасибо за правку, которая идеально решает мой вариант использования, и за предложение file.mtime(), поскольку я думаю, что хеширование необработанных входных данных (которые почти никогда не меняются) было одной из самых медленных частей моего рабочего процесса. Я предложил незначительное изменение ответа, чтобы удалить аргумент suffix из фиктивного вызова get_data, чтобы пример до совпадения с примером после. - person Matthew Strasiotto; 16.12.2019