Я создал служебный сценарий R, util.R, который я хочу использовать из других сценариев в моем проекте. Как правильно гарантировать, что функция, определяемая этим сценарием, доступна для работы в других моих сценариях?
Я ищу что-то похожее на require
функцию, которая загружает пакет, только если он еще не загружен. Я не хочу звонить, source("util.R")
потому что это будет загружать скрипт каждый раз, когда он вызывается.
Я знаю, что я получу несколько ответов, в которых мне будет предложено создать пакет, как в случае с организацией исходного кода R :) Но я не создаю что-то, что будет использоваться где-то еще, это просто отдельный проект.
Ответы:
Вот один из возможных способов. Используйте
exists
функцию, чтобы проверить что-то уникальное в вашемutil.R
коде.Например:
(Отредактировано, чтобы включить
mode="function"
, как указал Гэвин Симпсон)источник
exists()
- нужноmode = "function"
добавить, чтобы сделать его надежнымexists()
похоже, выдает ошибку, за исключением возврата ее в R 3.0.2.Встроенной такой вещи нет, так как R не отслеживает вызовы
source
и не может определить, что было загружено и откуда (это не тот случай, когда используются пакеты). Тем не менее, вы можете использовать ту же идею, что и в.h
файлах C , то есть обернуть все в:источник
source("util.R")
поif
коду, верно?Say
util.R
производит функциюfoo()
. Вы можете проверить, доступна ли эта функция в глобальной среде, и создать скрипт, если это не так:Что найдешь по названию
foo
. Если вы хотите найти функцию, то (как упомянул @Andrie)exists()
полезно, но необходимо указать , какой именно тип объекта искать, напримерВот
exists()
в действии:источник
grepl(..., value=TRUE)
потому что ваш поисковый запрос, вероятно, не является регулярным выражением. +1, кстати.grepl()
не имеет аргументовvalue
, но мне, вероятно, следует исправить регулярное выражение вls()
...fixed=TRUE
exists()
лучше, но теперь я вижу, что вы тем временем отправили такой ответ.Вы можете написать функцию, которая принимает имя файла и имя среды, проверяет, был ли файл загружен в среду, и использует его
sys.source
в качестве источника, если нет.Вот быстрая и непроверенная функция (улучшения приветствуются!):
источник
Вот функция, которую я написал. Он обертывает
base::source
функцию для хранения списка исходных файлов в глобальном списке среды с именемsourced
. Он будет повторно использовать файл только в том случае, если вы предоставите.force=TRUE
аргумент для вызова источника. Его сигнатура аргумента в остальном идентична реальной,source()
поэтому вам не нужно переписывать свои сценарии, чтобы использовать это.Он довольно болтливый (много звонков
message()
), так что вы можете отказаться от этих линий, если хотите. Любые советы опытных пользователей R приветствуются; Я новичок в R.источник
Я решил свою проблему, используя весь адрес, где находится мой код: До:
После:
источник