Я просеиваю пакет и скрипты, которые используют пакет, и хотел бы идентифицировать внешние зависимости. Цель состоит в том, чтобы изменить скрипты, чтобы указать 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()
вместо стека кода.