Estoy revisando un paquete y scripts que utilizan el paquete y me gustaría identificar dependencias externas. El objetivo es modificar los scripts para especificar library(pkgName)
y modificar las funciones en el paquete para usar require(pkgName)
, de modo que estas dependencias serán más obvias más adelante.Identificación de dependencias de funciones R y scripts
Estoy revisando el código para dar cuenta de cada paquete dependiente externamente. Como ejemplo, aunque de ninguna manera es definitivo, ahora me resulta difícil identificar el código que depende de data.table
. Podría reemplazar data.table
con Matrix
, ggplot2
, bigmemory
, plyr
o muchos otros paquetes, así que no dude en responder con ejemplos basados en otros paquetes.
Esta búsqueda no es particularmente fácil. Los enfoques que he probado hasta ahora incluyen:
- de búsqueda de códigos para
library
yrequire
declaraciones - Buscar menciones de
data.table
(por ejemplolibrary(data.table)
) - Intente ejecutar
codetools::checkUsage
para determinar dónde puede haber algunos problemas. Para los scripts, mi programa inserta el script en una función local y aplicacheckUsage
a esa función. De lo contrario, usocheckUsagePackage
para el paquete. - Busque declaraciones que sean un tanto exclusivas de
data.table
, como:=
. - Busque donde las clases de objetos pueden ser identificados a través de la notación húngara, como
DT
La esencia de mi búsqueda es encontrar:
- carga de
data.table
, - objetos con nombres que indican que son objetos
data.table
, - métodos que parecen ser
data.table
-específicos
La única parte fácil de esto parece ser encontrar dónde se carga el paquete. Desafortunadamente, no todas las funciones pueden cargar o requerir explícitamente el paquete externo; pueden suponer que ya se ha cargado. Esta es una mala práctica, y estoy tratando de arreglarlo. Sin embargo, buscar objetos y métodos parece ser un desafío.
Esto (data.table
) es solo un paquete, y uno con un uso que parece limitado y algo único. Supongamos que quisiera buscar usos de funciones ggplot, donde las opciones son más extensas, y el texto de la sintaxis no es tan idiosincrásico (es decir, el uso frecuente de +
no es idiosincrásico, mientras que :=
parece serlo).
No creo que el análisis estático dé una respuesta perfecta, p. uno podría pasar un argumento a una función, que especifica un paquete que se cargará. No obstante, ¿hay herramientas o paquetes básicos que puedan mejorar este enfoque de fuerza bruta, ya sea mediante análisis estático o dinámico?
Por lo que vale, tools::pkgDepends
solo trata las dependencias a nivel de paquete, no la función o el nivel de script, que es el nivel en el que estoy trabajando.
Actualización 1: Un ejemplo de herramienta de análisis dinámico que debería funcionar es aquella que informa qué paquetes se cargan durante la ejecución del código. No sé si existe esa capacidad en R, sin embargo, sería como Rprof
informando la salida de search()
en lugar de la pila de códigos.
¿Podría probar 'foodweb' en el paquete' mvbutils'? No tengo experiencia con él pero me parece prometedor (excepto que no sé qué tan profundo lo busca). Algo como 'foodweb (where = 'paquete: data.table', prune = 'function_youre_examining')'? –
@ mathematical.coffee Eso es muy intrigante. Parece que sería bastante útil dentro del paquete; Todavía no tengo claro qué puede hacer entre paquetes, pero voy a darle un giro, ¡gracias! – Iterator
@ mathematical.coffee Esto es muy interesante. Me estoy ocupando un poco más. ¿Puedes publicar tu comentario como respuesta? Puedo ayudar a editarlo en una solución, suponiendo que pueda hacerlo funcionar. Anteriormente comenté que no parecía funcionar en todos los paquetes, pero eso no es correcto. El argumento 'where' parece ser el truco para administrar el espacio de búsqueda. Por cierto, la ayuda para los genes cambiados. Lee casi como escribiría sobre algunas de mis experiencias recientes. :) – Iterator