Я просеиваю пакет и скрипты, которые используют пакет, и хотел бы идентифицировать внешние зависимости. Цель состоит в том, чтобы изменить скрипты, чтобы указать library(pkgName) и изменить функции в пакете, чтобы использовать require(pkgName), чтобы эти зависимости были более очевидными позже.
Я пересматриваю код для учета каждого внешне зависимого пакета. В качестве примера, хотя это никоим образом не является окончательным, мне теперь трудно идентифицировать код, который зависит от data.table. Я мог бы заменить data.table на Matrix, ggplot2, bigmemory, plyr или многие другие пакеты, поэтому не стесняйтесь отвечать примерами на основе других пакетов.
Этот поиск не очень прост. Подходы, которые я пробовал до сих пор, включают:
- Найдите код для операторов
libraryиrequire - Поиск упоминаний
data.table(например,library(data.table)) - Попробуйте запустить
codetools::checkUsage, чтобы определить, где могут быть некоторые проблемы. Для скриптов моя программа вставляет script в локальную функцию и применяет к этой функцииcheckUsage. В противном случае я используюcheckUsagePackageдля пакета. - Найдите выражения, которые несколько уникальны для
data.table, например:=. - Ищите, где классы объектов могут быть идентифицированы с помощью венгерской нотации, например
DT
Суть моего поиска - найти:
- загрузка
data.table, - объекты с именами, указывающими, что они являются
data.tableобъектами, - которые выглядят как
data.table-специфические
Единственная легкая часть этого, похоже, заключается в поиске места загрузки пакета. К сожалению, не все функции могут явно загружать или требовать внешний пакет - они могут считать, что он уже загружен. Это плохая практика, и я пытаюсь ее исправить. Однако поиск объектов и методов кажется сложным.
Это (data.table) - это всего лишь один пакет, и один с тем, что кажется ограниченным и несколько уникальным. Предположим, что я хотел искать возможности использования функций ggplot, где параметры более обширны, а текст синтаксиса не является таким же своеобразным (т.е. Частое использование + не является особенным, а := похоже).
Я не думаю, что статический анализ даст прекрасный ответ, например. можно передать аргумент функции, которая указывает пакет для загрузки. Тем не менее: существуют ли какие-либо основные инструменты или пакеты, которые могут улучшить этот подход с использованием грубой силы, либо посредством статического или динамического анализа?
Для того, что стоит, tools::pkgDepends учитывает только зависимости на уровне пакета, а не уровень функции или script, на котором я работаю.
Обновление 1: Примером инструмента для динамического анализа, который должен работать, является тот, который сообщает, какие пакеты загружаются во время выполнения кода. Я не знаю, существует ли такая возможность в R, но это будет похоже на Rprof сообщение о выходе search() вместо стека кода.