Dépendances des packages R sur Github

Pour chaque paquet collecté sur CRAN, Github, Bioconductor et R-Forge, nous allons récupérer la liste des dépendances dans les champs "Depends" et "Imports", et étudier la répartition de ces dépendances dans les différentes communautés. En plus de ces différentes communautés, certains packages (apparaissant dans les dépendances) sont des paquets fournis par défaut avec une distribution R. Ces paquets sont les suivants :


In [2]:
R_pkg = ('R MASS Matrix base boot class cluster codetools compiler datasets foreign grDevices ' +
        'graphics grid lattice methods mgcv nlme nnet parallel rpart ' +
        'spatial splines stats stats4 survival tcltk tools translations utils').split(' ')
"""
R_pkg = ('R, base, compiler, datasets, graphics, '
         'grDevices, grid, methods, parallel, profile, splines, stats, stats4, '
         'tcltk, tools, translations, utils').split(', ')
"""


sources = ['cran', 'bioconductor', 'github', 'rforge']

In [3]:
%matplotlib inline
from IPython.display import set_matplotlib_formats
import matplotlib.pyplot as plt
import os.path
#set_matplotlib_formats('pdf')

In [4]:
import pandas

df = pandas.DataFrame.from_csv('../data/R-Packages.csv')
df = df.fillna(value={'Depends': '', 'Imports': ''})

df = df.drop('profile')

La fonction suivante va récupérer les dépendances dans les champs "Depends" et "Imports" d'une série. Le parsing est naif, mais devrait matcher les paquets existants.


In [5]:
def parse_dependencies(item):
    depends = item['Depends'] if item['Depends'] != pandas.np.nan else ''
    imports = item['Imports'] if item['Imports'] != pandas.np.nan else ''
    f = lambda lst: [dep.split('(')[0].strip() for dep in lst.split(',')]
    return filter(lambda x: len(x) > 0, f(depends) + f(imports))

La classe suivante sert de base à notre graphe. Les attributs sont :

  • name: nom du package
  • sources: liste des sources où ce paquet peut être trouvé
  • source: source principale (dans l'ordre indiqué)
  • dependencies: dictionnaire nom --> Package instance

La méthode add_source permet d'ajouter une source (str). La liste dependencies peut être manipulée directement.


In [6]:
class Package(object):
    sources = ['R', 'cran', 'bioconductor', 'biocDS', 'github', 'rforge']
    
    def __init__(self, name):
        self.name = name
        self.sources = []
        self.dependencies = {}
        
    def add_source(self, source):
        if source not in self.sources:
            self.sources.append(source)
            
    @property
    def source(self):
        for source in Package.sources:
            if source in self.sources:
                return source
        return 'Unknown'
    
    def installable_with(self, sources):
        # List of packages needed for the current one
        relies_on = set(self.dependencies.itervalues())
        tested = set([self])
        
        while len(relies_on) > 0:
            p = relies_on.pop()
            tested.add(p)
            
            # Can p be installed using current sources?
            if len(set(sources).intersection(set(p.sources))) == 0:
                return False
            # Add p's dependencies
            for d in p.dependencies.itervalues():
                if d not in tested:
                    relies_on.add(d)
        return True
    
    def pprint(self):
        return str(self) + ' -> ' + ', '.join(map(str, self.dependencies.itervalues()))
    
    def __unicode__(self):
        return '{name} on [{sources}]'.format(name=self.name, sources=', '.join(self.sources))
    __str__ = __repr__ = __unicode__

Pour chaque paquet identifié, nous ajoutons ces sources. Le dictionnaire packages vise à associer à chaque nom de paquet une instance de la classe Package.


In [7]:
packages = {}

for name, data in df.iterrows():
    p = Package(name)
    for source in sources:
        if data[source] == 1:
            p.add_source(source)
    packages[name] = p

Ajoutons R dans les sources avec les packages correspondants.


In [8]:
sources.append('R')

for name in R_pkg:
    # new data:
    p = Package(name)
    # keep existing data:
    # p = packages.setdefault(name, Package(name)) 
    
    p.add_source('R')
    packages[name] = p

Ajoutons maintenant les packages contenant un dataset sur BioConductor.


In [9]:
sources.append('biocDS')

biocDS1 = pandas.DataFrame.from_csv('../data/bioconductor_annotation_description.csv')
biocDS2 = pandas.DataFrame.from_csv('../data/bioconductor_experiment_description.csv')

biocDS1.fillna(value='', inplace=True)
biocDS2.fillna(value='', inplace=True)

for name, data in biocDS1.iterrows():
    p = Package(name)
    p.add_source('biocDS')
    packages[name] = p

for name, data in biocDS2.iterrows():
    p = Package(name)
    p.add_source('biocDS')
    packages[name] = p

#print len(filter(lambda p: 'biocDS' in p.sources, packages.itervalues()))
#print len(filter(lambda p: 'biocDS' == p.source, packages.itervalues()))
# Ajout des dépendances
for name, data in biocDS1.iterrows():
    p = packages[name]
    for dep in parse_dependencies(data):
        p_dep = packages.setdefault(dep, Package(dep))
        p.dependencies[p_dep.name] = p_dep
        
for name, data in biocDS1.iterrows():
    p = packages[name]
    for dep in parse_dependencies(data):
        p_dep = packages.setdefault(dep, Package(dep))
        p.dependencies[p_dep.name] = p_dep

Ajoutons les dépendances. Si le paquet n'est pas connu de notre liste de paquets, nous créons tout de même une instance de Package. La source associée à ce paquet sera automatiquement Unknown et ce paquet pourra donc être utilisé de façon transparente lors des calculs sur le graphe.


In [10]:
for name, data in df.iterrows():
    p = packages[name]
    for dep in parse_dependencies(data):
        p_dep = packages.setdefault(dep, Package(dep))
        p.dependencies[p_dep.name] = p_dep

Enfin, il nous reste à créer le graphe dirigé. Ce graphe est construit classiquement pour les dépendances. A noter que les dépendances de la source Unknown sont également dans ce graphe (qui n'est naturellement pas une composante connexe).


In [12]:
import networkx

dg = networkx.DiGraph()
for package in packages.itervalues():
    dg.add_node(package)
    for dependency in package.dependencies.itervalues():
        dg.add_edge(package, dependency)

Création d'un nouveau graphe dont les noeuds sont des strings et avec un attribut source pour l'export en GraphML.


In [14]:
filename = os.path.join("../data", "deps.graphml")

dg2 = networkx.DiGraph()
packages2 = (package for package in packages.itervalues() if type(package.name) is str)
for package in packages2:
    dg2.add_node(package.name, package=package.name,  source=package.source)
    for dependency in package.dependencies.itervalues():
        dg2.add_edge(package.name, dependency.name)

networkx.write_graphml(dg2, filename)

Centralité


In [11]:
def d2df(gd):
    m = {}
    for package, value in gd.iteritems():
        m[package.name] = {'source': package.source, 'value': value}
    return pandas.DataFrame.from_dict(m, orient='index')

for name, group in d2df(networkx.in_degree_centrality(dg)).groupby(by='source'):
    fig = plt.figure()
    ax = fig.add_subplot(111)
    group['value'].plot(kind='hist', figsize=(8,4), bins=10, title=name, ax=ax)


Direction des dépendances

Pour chaque source de packages, nous allons regarder les différents paquets présents dans cette source. Pour chaque paquet, nous regardons les dépendances de ce paquet et la source principale de chacune de ces dépendances. Une liste $S(x,y)$ est calculée pour chaque paire $(x,y)$ de sources. Cette liste contient l'ensemble des paquets de $x$ qui ont au moins une dépendance dans $y$.


In [12]:
S = {s:{s2: set() for s2 in sources + ['Unknown']} for s in sources}

In [13]:
sources_needed_for = lambda p: set(map(lambda p: p.source, p.dependencies.itervalues()))

for p in packages.itervalues():
    for source in sources_needed_for(p):
        S[p.source][source].add(p)

In [14]:
scores = {s: {s2: len(S[s][s2]) for s2 in S[s].iterkeys()} for s in S.iterkeys()}

Le tableau suivant reprend, pour chaque ligne, le nombre de paquets ayant au moins une dépendance vers la source indiquée en colonne. Par exemple, la ligne bioconductor en colonne cran indique qu'il y a x paquets de BioConductor qui ont au moins une dépendance vers CRAN.


In [35]:
S['cran']['github']
packages['reports'].dependencies


Out[35]:
{'R': R on [R],
 'XLConnect': XLConnect on [cran, github],
 'knitcitations': knitcitations on [cran, github],
 'markdown': markdown on [cran],
 'slidify': slidify on [github],
 'tools': tools on [R],
 'xlsx': xlsx on [cran, rforge]}

In [15]:
pandas.DataFrame.from_dict(scores).T


Out[15]:
R Unknown biocDS bioconductor cran github rforge
R 14 0 0 0 0 0 0
biocDS 805 0 196 860 170 0 0
bioconductor 917 11 93 769 586 2 1
cran 4578 0 4 135 3909 1 1
github 2185 140 22 267 2512 292 14
rforge 753 29 2 44 663 14 103

Quels sont les paquets "inconnus" ?


In [16]:
# map(lambda p: p.name, filter(lambda p: p.source == 'Unknown', packages.itervalues()))

Cycles dans le graphe ?


In [17]:
list(networkx.simple_cycles(dg))


Out[17]:
[[BioCycTU on [github]],
 [AnnotationHub on [bioconductor, github],
  interactiveDisplay on [bioconductor]]]

Le tableau suivant reprend, pour chaque ligne, le nombre de dépendances dans la source indiquée en colonne. Par exemple, la ligne bioconductor en colonne cran indique qu'il y a x dépendances intervenant dans un paquet de BioConductor, et ces x dépendances sont présentes sur CRAN (un même nom est potentiellement comptabilisé plusieurs fois).


In [18]:
scores_all = {}
for p in packages.itervalues():
    score = scores_all.setdefault(p.source, {})
    for d in p.dependencies.itervalues():
        score[d.source] = score.get(d.source, 0) + 1
pandas.DataFrame.from_dict(scores_all).T


Out[18]:
R Unknown biocDS bioconductor cran github rforge
R 60 NaN NaN NaN NaN NaN NaN
Unknown NaN NaN NaN NaN NaN NaN NaN
biocDS 1213 NaN 204 1567 333 NaN NaN
bioconductor 2516 13 133 2748 1615 2 1
cran 8549 NaN 4 212 10560 1 1
github 3208 156 37 684 8614 386 15
rforge 1376 36 4 93 1830 19 136

Le tableau suivant reprend, pour chaque ligne, le nombre de paquets distincts servant de dépendance pour la source indiquée en colonne.


In [19]:
distinct_scores_all = {}
for p in packages.itervalues():
    score = distinct_scores_all.setdefault(p.source, {})
    for d in p.dependencies.itervalues():
        score.setdefault(d.source, set()).add(d.name)
        
# Get numbers
for s1, d1 in distinct_scores_all.iteritems():
    for s2, d2 in d1.iteritems():
        d1[s2] = len(d2)
        
pandas.DataFrame.from_dict(distinct_scores_all)


Out[19]:
R Unknown biocDS bioconductor cran github rforge
R 12 NaN 3 26 28 29 26
Unknown NaN NaN NaN 10 NaN 89 31
biocDS NaN NaN 48 69 2 21 3
bioconductor NaN NaN 28 264 65 126 48
cran NaN NaN 4 371 1532 1009 550
github NaN NaN NaN 1 1 251 6
rforge NaN NaN NaN 1 1 12 94

Dépendances les plus fréquentes par source


In [20]:
dg2 = dg.copy()
dg2.remove_nodes_from(filter(lambda n: n.source == 'Unknown' or n.source == 'R', dg2.nodes_iter()))
in_degrees = [n for n in dg2.in_degree_iter()]
in_degrees.sort(key=lambda n: n[1], reverse=True)

La liste suivante reprend les dépendances apparaissant le plus fréquemment pour chaque source de packages. La liste primarily indique que ce package a comme source principale la source concernée. La liste also available indique que ce paquet est notamment disponible sur la source concernée. Notez bien que ce sont les dépendances de toutes les sources vers une source spécifique. Pour une liste des dépendances de chaque source, regardez (bien) plus bas.


In [21]:
for source in ['cran', 'bioconductor', 'biocDS', 'github', 'rforge']: 
    print 'Most frequent dependency, for all packages, primarily on', source
    _ = filter(lambda x: x[0].source == source, in_degrees)[:10]
    print '\n'.join([str(n[0]) + ' : ' + str(n[1]) for n in _])
    print


Most frequent dependency, for all packages, primarily on cran
ggplot2 on [cran, github] : 933
plyr on [cran, github] : 769
Rcpp on [cran, rforge] : 664
stringr on [cran, github] : 484
reshape2 on [cran, github] : 456
XML on [cran] : 443
RCurl on [cran] : 426
mvtnorm on [cran, rforge] : 343
RColorBrewer on [cran] : 308
sp on [cran, rforge] : 306

Most frequent dependency, for all packages, primarily on bioconductor
AnnotationDbi on [bioconductor] : 618
Biobase on [bioconductor] : 440
IRanges on [bioconductor, github] : 414
Biostrings on [bioconductor] : 330
S4Vectors on [bioconductor] : 255
GenomicRanges on [bioconductor, github] : 236
BiocGenerics on [bioconductor] : 206
oligoClasses on [bioconductor, github] : 177
oligo on [bioconductor, github] : 175
limma on [bioconductor] : 143

Most frequent dependency, for all packages, primarily on biocDS
org.Hs.eg.db on [biocDS] : 98
org.Mm.eg.db on [biocDS] : 49
GO.db on [biocDS] : 38
org.Rn.eg.db on [biocDS] : 30
KEGG.db on [biocDS] : 12
TxDb.Hsapiens.UCSC.hg19.knownGene on [biocDS] : 8
BSgenome.Hsapiens.UCSC.hg19 on [biocDS] : 7
org.Sc.sgd.db on [biocDS] : 6
IlluminaHumanMethylation450kmanifest on [biocDS] : 5
hgu133a.db on [biocDS] : 3

Most frequent dependency, for all packages, primarily on github
FLCore on [github, rforge] : 24
opal on [github] : 9
rCharts on [github] : 8
mjcbase on [github] : 8
wtsUtilities on [github] : 8
SqlRender on [github] : 6
DatabaseConnector on [github] : 6
stringtools on [github] : 5
rccmisc on [github] : 5
XMLSchema on [github] : 5

Most frequent dependency, for all packages, primarily on rforge
oompaBase on [rforge] : 8
FLash on [rforge] : 5
twMisc on [rforge] : 5
addendum on [rforge] : 5
easydb on [rforge] : 4
ant on [rforge] : 4
twDEMC on [rforge] : 4
PortfolioAnalytics on [rforge] : 3
eatTools on [rforge] : 3
ClassDiscovery on [rforge] : 3


In [22]:
for source in ['cran', 'bioconductor', 'biocDS', 'github', 'rforge']: 
    print 'Most frequent dependency, for all packages, available on', source
    _ = filter(lambda x: source in x[0].sources, in_degrees)[:10]
    print '\n'.join([str(n[0]) + ' : ' + str(n[1]) for n in _])
    print


Most frequent dependency, for all packages, available on cran
ggplot2 on [cran, github] : 933
plyr on [cran, github] : 769
Rcpp on [cran, rforge] : 664
stringr on [cran, github] : 484
reshape2 on [cran, github] : 456
XML on [cran] : 443
RCurl on [cran] : 426
mvtnorm on [cran, rforge] : 343
RColorBrewer on [cran] : 308
sp on [cran, rforge] : 306

Most frequent dependency, for all packages, available on bioconductor
AnnotationDbi on [bioconductor] : 618
Biobase on [bioconductor] : 440
IRanges on [bioconductor, github] : 414
Biostrings on [bioconductor] : 330
S4Vectors on [bioconductor] : 255
GenomicRanges on [bioconductor, github] : 236
BiocGenerics on [bioconductor] : 206
oligoClasses on [bioconductor, github] : 177
oligo on [bioconductor, github] : 175
limma on [bioconductor] : 143

Most frequent dependency, for all packages, available on biocDS
org.Hs.eg.db on [biocDS] : 98
org.Mm.eg.db on [biocDS] : 49
GO.db on [biocDS] : 38
org.Rn.eg.db on [biocDS] : 30
KEGG.db on [biocDS] : 12
TxDb.Hsapiens.UCSC.hg19.knownGene on [biocDS] : 8
BSgenome.Hsapiens.UCSC.hg19 on [biocDS] : 7
org.Sc.sgd.db on [biocDS] : 6
IlluminaHumanMethylation450kmanifest on [biocDS] : 5
hgu133a.db on [biocDS] : 3

Most frequent dependency, for all packages, available on github
ggplot2 on [cran, github] : 933
plyr on [cran, github] : 769
stringr on [cran, github] : 484
reshape2 on [cran, github] : 456
IRanges on [bioconductor, github] : 414
DBI on [cran, github] : 294
httr on [cran, github] : 266
dplyr on [cran, github] : 261
GenomicRanges on [bioconductor, github] : 236
zoo on [cran, github, rforge] : 199

Most frequent dependency, for all packages, available on rforge
Rcpp on [cran, rforge] : 664
mvtnorm on [cran, rforge] : 343
sp on [cran, rforge] : 306
data.table on [cran, rforge] : 286
foreach on [cran, rforge] : 207
zoo on [cran, github, rforge] : 199
ape on [cran, rforge] : 190
raster on [cran, rforge] : 178
digest on [cran, rforge] : 163
xtable on [cran, rforge] : 156

La liste suivante reprend, pour chaque communauté, les dépendances les plus fréquentes (toute source confondue).


In [23]:
from collections import Counter

for source in ['cran', 'bioconductor', 'biocDS', 'github', 'rforge']: 
    pkgs = filter(lambda x: x.source == source, packages.itervalues())
    deps = []
    for pkg in pkgs:
        _ = filter(lambda x: x.source != 'R' and x.source != 'Unknown', pkg.dependencies.itervalues())
        deps.extend(_)
    print 'Most frequent dependency for packages in', source
    print '\n'.join([str(n[0]) + ' : ' + str(n[1]) for n in Counter(deps).most_common(10)])
    print


Most frequent dependency for packages in cran
Rcpp on [cran, rforge] : 336
ggplot2 on [cran, github] : 289
mvtnorm on [cran, rforge] : 258
plyr on [cran, github] : 248
sp on [cran, rforge] : 169
XML on [cran] : 144
stringr on [cran, github] : 143
igraph on [cran] : 142
RCurl on [cran] : 139
coda on [cran] : 134

Most frequent dependency for packages in bioconductor
Biobase on [bioconductor] : 352
IRanges on [bioconductor, github] : 183
BiocGenerics on [bioconductor] : 181
GenomicRanges on [bioconductor, github] : 154
Biostrings on [bioconductor] : 106
AnnotationDbi on [bioconductor] : 99
limma on [bioconductor] : 96
S4Vectors on [bioconductor] : 93
Rsamtools on [bioconductor] : 76
RColorBrewer on [cran] : 76

Most frequent dependency for packages in biocDS
AnnotationDbi on [bioconductor] : 488
IRanges on [bioconductor, github] : 171
RSQLite on [cran] : 169
Biostrings on [bioconductor] : 166
oligo on [bioconductor, github] : 162
DBI on [cran, github] : 162
oligoClasses on [bioconductor, github] : 161
S4Vectors on [bioconductor] : 151
MeSHDbi on [bioconductor] : 123
BSgenome on [bioconductor] : 75

Most frequent dependency for packages in github
ggplot2 on [cran, github] : 539
plyr on [cran, github] : 434
stringr on [cran, github] : 312
reshape2 on [cran, github] : 273
RCurl on [cran] : 239
Rcpp on [cran, rforge] : 229
XML on [cran] : 217
dplyr on [cran, github] : 214
data.table on [cran, rforge] : 196
httr on [cran, github] : 182

Most frequent dependency for packages in rforge
Rcpp on [cran, rforge] : 59
plyr on [cran, github] : 43
rJava on [cran] : 35
sp on [cran, rforge] : 34
ggplot2 on [cran, github] : 34
XML on [cran] : 33
raster on [cran, rforge] : 31
zoo on [cran, github, rforge] : 27
mvtnorm on [cran, rforge] : 24
xts on [cran, github, rforge] : 24

Installation des paquets en tenant compte de leurs dépendances


In [24]:
# Packages that are available in at least one of our true sources.
candidates = filter(lambda p: len(p.sources) > 0, packages.itervalues())

In [25]:
import itertools

combinations = [('R', )]
for i in range(1, 6):
    for comb in itertools.combinations(filter(lambda x: x != 'R', sources), i):
        e = ['R'] + list(comb)
        e.sort()
        e = tuple(e) # hashable
        combinations.append(e)

In [26]:
installables = {}

installables['all'] = {}
for comb in combinations:
    n = filter(lambda p: p.installable_with(comb), candidates)
    installables['all'][comb] = len(n)  # Change to n if you are interested in the packages list

for source in sources:
    if source == 'R':
        continue
    installables[source] = {}
    for comb in combinations:
        n = filter(lambda p: p.installable_with(comb), filter(lambda p: source in p.sources, candidates))
        installables[source][comb] = len(n)

A ce stade-ci du notebook, plusieurs éléments importants sont disponibles :

  • sources est une liste des sources disponibles.
  • combinations est une liste des combinaisons de sources (type tuple) utilisés pour le calcul de l'installabilité.
  • candidates est une liste de tous les paquets candidats à l'installation (autrement dit, tout ceux qui sont au moins disponibles sur l'une de nos sources).

installables est maintenant un dictionnaire dont les clés sont les sources disponibles, et la valeur est un dictionnaire reprenant, pour chaque combinaison de sources, le nombre de packages virtuellement installables depuis cette combinaison.

Par exemple, pour connaître les paquets de R-Forge qui sont installables avec R, GitHub et R-Forge, il convient d'utiliser ceci :


In [27]:
installables['rforge'][('R', 'github', 'rforge')]


Out[27]:
1115

Notez que les éléments formant le tuple utilisé comme clé du dictionnaire sont triés par ordre alphabétique.


In [28]:
for source in installables.iterkeys():
    if source == 'all':
        n = len(candidates)
    else:
        n = len(filter(lambda p: source in p.sources, candidates))
    print n, 'candidates on', source
    for combination, value in installables[source].iteritems():
        print value, 'installable packages using', str(combination)
    print


13390 candidates on all
5530 installable packages using ('R', 'biocDS', 'rforge')
6046 installable packages using ('R', 'github', 'rforge')
5527 installable packages using ('R', 'rforge')
4544 installable packages using ('R', 'bioconductor')
11152 installable packages using ('R', 'biocDS', 'cran', 'github', 'rforge')
6324 installable packages using ('R', 'bioconductor', 'github', 'rforge')
10909 installable packages using ('R', 'cran', 'rforge')
12820 installable packages using ('R', 'biocDS', 'bioconductor', 'cran')
5791 installable packages using ('R', 'bioconductor', 'rforge')
4654 installable packages using ('R', 'biocDS', 'github')
10789 installable packages using ('R', 'biocDS', 'cran')
12717 installable packages using ('R', 'bioconductor', 'cran', 'github')
12461 installable packages using ('R', 'bioconductor', 'cran')
4874 installable packages using ('R', 'bioconductor', 'github')
4328 installable packages using ('R',)
6049 installable packages using ('R', 'biocDS', 'github', 'rforge')
4552 installable packages using ('R', 'biocDS', 'bioconductor')
11045 installable packages using ('R', 'biocDS', 'cran', 'github')
11147 installable packages using ('R', 'cran', 'github', 'rforge')
11040 installable packages using ('R', 'cran', 'github')
4651 installable packages using ('R', 'github')
12600 installable packages using ('R', 'bioconductor', 'cran', 'rforge')
12961 installable packages using ('R', 'biocDS', 'bioconductor', 'cran', 'rforge')
4331 installable packages using ('R', 'biocDS')
10914 installable packages using ('R', 'biocDS', 'cran', 'rforge')
12838 installable packages using ('R', 'bioconductor', 'cran', 'github', 'rforge')
13080 installable packages using ('R', 'biocDS', 'bioconductor', 'cran', 'github')
10784 installable packages using ('R', 'cran')
4882 installable packages using ('R', 'biocDS', 'bioconductor', 'github')
13203 installable packages using ('R', 'biocDS', 'bioconductor', 'cran', 'github', 'rforge')
6334 installable packages using ('R', 'biocDS', 'bioconductor', 'github', 'rforge')
5801 installable packages using ('R', 'biocDS', 'bioconductor', 'rforge')

5140 candidates on github
1780 installable packages using ('R', 'biocDS', 'rforge')
2154 installable packages using ('R', 'github', 'rforge')
1780 installable packages using ('R', 'rforge')
1463 installable packages using ('R', 'bioconductor')
4567 installable packages using ('R', 'biocDS', 'cran', 'github', 'rforge')
2219 installable packages using ('R', 'bioconductor', 'github', 'rforge')
4347 installable packages using ('R', 'cran', 'rforge')
4720 installable packages using ('R', 'biocDS', 'bioconductor', 'cran')
1838 installable packages using ('R', 'bioconductor', 'rforge')
1616 installable packages using ('R', 'biocDS', 'github')
4315 installable packages using ('R', 'biocDS', 'cran')
4912 installable packages using ('R', 'bioconductor', 'cran', 'github')
4664 installable packages using ('R', 'bioconductor', 'cran')
1658 installable packages using ('R', 'bioconductor', 'github')
1422 installable packages using ('R',)
2154 installable packages using ('R', 'biocDS', 'github', 'rforge')
1463 installable packages using ('R', 'biocDS', 'bioconductor')
4549 installable packages using ('R', 'biocDS', 'cran', 'github')
4567 installable packages using ('R', 'cran', 'github', 'rforge')
4549 installable packages using ('R', 'cran', 'github')
1616 installable packages using ('R', 'github')
4697 installable packages using ('R', 'bioconductor', 'cran', 'rforge')
4755 installable packages using ('R', 'biocDS', 'bioconductor', 'cran', 'rforge')
1422 installable packages using ('R', 'biocDS')
4347 installable packages using ('R', 'biocDS', 'cran', 'rforge')
4931 installable packages using ('R', 'bioconductor', 'cran', 'github', 'rforge')
4972 installable packages using ('R', 'biocDS', 'bioconductor', 'cran', 'github')
4315 installable packages using ('R', 'cran')
1658 installable packages using ('R', 'biocDS', 'bioconductor', 'github')
4993 installable packages using ('R', 'biocDS', 'bioconductor', 'cran', 'github', 'rforge')
2219 installable packages using ('R', 'biocDS', 'bioconductor', 'github', 'rforge')
1838 installable packages using ('R', 'biocDS', 'bioconductor', 'rforge')

997 candidates on bioconductor
139 installable packages using ('R', 'biocDS', 'rforge')
139 installable packages using ('R', 'github', 'rforge')
136 installable packages using ('R', 'rforge')
265 installable packages using ('R', 'bioconductor')
233 installable packages using ('R', 'biocDS', 'cran', 'github', 'rforge')
327 installable packages using ('R', 'bioconductor', 'github', 'rforge')
222 installable packages using ('R', 'cran', 'rforge')
980 installable packages using ('R', 'biocDS', 'bioconductor', 'cran')
319 installable packages using ('R', 'bioconductor', 'rforge')
120 installable packages using ('R', 'biocDS', 'github')
226 installable packages using ('R', 'biocDS', 'cran')
862 installable packages using ('R', 'bioconductor', 'cran', 'github')
862 installable packages using ('R', 'bioconductor', 'cran')
271 installable packages using ('R', 'bioconductor', 'github')
112 installable packages using ('R',)
142 installable packages using ('R', 'biocDS', 'github', 'rforge')
272 installable packages using ('R', 'biocDS', 'bioconductor')
232 installable packages using ('R', 'biocDS', 'cran', 'github')
228 installable packages using ('R', 'cran', 'github', 'rforge')
227 installable packages using ('R', 'cran', 'github')
117 installable packages using ('R', 'github')
866 installable packages using ('R', 'bioconductor', 'cran', 'rforge')
985 installable packages using ('R', 'biocDS', 'bioconductor', 'cran', 'rforge')
115 installable packages using ('R', 'biocDS')
227 installable packages using ('R', 'biocDS', 'cran', 'rforge')
866 installable packages using ('R', 'bioconductor', 'cran', 'github', 'rforge')
980 installable packages using ('R', 'biocDS', 'bioconductor', 'cran', 'github')
221 installable packages using ('R', 'cran')
278 installable packages using ('R', 'biocDS', 'bioconductor', 'github')
985 installable packages using ('R', 'biocDS', 'bioconductor', 'cran', 'github', 'rforge')
336 installable packages using ('R', 'biocDS', 'bioconductor', 'github', 'rforge')
328 installable packages using ('R', 'biocDS', 'bioconductor', 'rforge')

1115 candidates on biocDS
255 installable packages using ('R', 'biocDS', 'rforge')
255 installable packages using ('R', 'github', 'rforge')
255 installable packages using ('R', 'rforge')
260 installable packages using ('R', 'bioconductor')
255 installable packages using ('R', 'biocDS', 'cran', 'github', 'rforge')
261 installable packages using ('R', 'bioconductor', 'github', 'rforge')
255 installable packages using ('R', 'cran', 'rforge')
1115 installable packages using ('R', 'biocDS', 'bioconductor', 'cran')
260 installable packages using ('R', 'bioconductor', 'rforge')
255 installable packages using ('R', 'biocDS', 'github')
255 installable packages using ('R', 'biocDS', 'cran')
915 installable packages using ('R', 'bioconductor', 'cran', 'github')
915 installable packages using ('R', 'bioconductor', 'cran')
260 installable packages using ('R', 'bioconductor', 'github')
255 installable packages using ('R',)
255 installable packages using ('R', 'biocDS', 'github', 'rforge')
260 installable packages using ('R', 'biocDS', 'bioconductor')
255 installable packages using ('R', 'biocDS', 'cran', 'github')
255 installable packages using ('R', 'cran', 'github', 'rforge')
255 installable packages using ('R', 'cran', 'github')
255 installable packages using ('R', 'github')
915 installable packages using ('R', 'bioconductor', 'cran', 'rforge')
1115 installable packages using ('R', 'biocDS', 'bioconductor', 'cran', 'rforge')
255 installable packages using ('R', 'biocDS')
255 installable packages using ('R', 'biocDS', 'cran', 'rforge')
915 installable packages using ('R', 'bioconductor', 'cran', 'github', 'rforge')
1115 installable packages using ('R', 'biocDS', 'bioconductor', 'cran', 'github')
255 installable packages using ('R', 'cran')
260 installable packages using ('R', 'biocDS', 'bioconductor', 'github')
1115 installable packages using ('R', 'biocDS', 'bioconductor', 'cran', 'github', 'rforge')
261 installable packages using ('R', 'biocDS', 'bioconductor', 'github', 'rforge')
260 installable packages using ('R', 'biocDS', 'bioconductor', 'rforge')

6397 candidates on cran
3200 installable packages using ('R', 'biocDS', 'rforge')
3428 installable packages using ('R', 'github', 'rforge')
3200 installable packages using ('R', 'rforge')
2484 installable packages using ('R', 'bioconductor')
6255 installable packages using ('R', 'biocDS', 'cran', 'github', 'rforge')
3464 installable packages using ('R', 'bioconductor', 'github', 'rforge')
6241 installable packages using ('R', 'cran', 'rforge')
6393 installable packages using ('R', 'biocDS', 'bioconductor', 'cran')
3235 installable packages using ('R', 'bioconductor', 'rforge')
2621 installable packages using ('R', 'biocDS', 'github')
6240 installable packages using ('R', 'biocDS', 'cran')
6388 installable packages using ('R', 'bioconductor', 'cran', 'github')
6385 installable packages using ('R', 'bioconductor', 'cran')
2653 installable packages using ('R', 'bioconductor', 'github')
2457 installable packages using ('R',)
3428 installable packages using ('R', 'biocDS', 'github', 'rforge')
2485 installable packages using ('R', 'biocDS', 'bioconductor')
6254 installable packages using ('R', 'biocDS', 'cran', 'github')
6255 installable packages using ('R', 'cran', 'github', 'rforge')
6254 installable packages using ('R', 'cran', 'github')
2621 installable packages using ('R', 'github')
6386 installable packages using ('R', 'bioconductor', 'cran', 'rforge')
6394 installable packages using ('R', 'biocDS', 'bioconductor', 'cran', 'rforge')
2457 installable packages using ('R', 'biocDS')
6241 installable packages using ('R', 'biocDS', 'cran', 'rforge')
6389 installable packages using ('R', 'bioconductor', 'cran', 'github', 'rforge')
6396 installable packages using ('R', 'biocDS', 'bioconductor', 'cran', 'github')
6240 installable packages using ('R', 'cran')
2654 installable packages using ('R', 'biocDS', 'bioconductor', 'github')
6397 installable packages using ('R', 'biocDS', 'bioconductor', 'cran', 'github', 'rforge')
3465 installable packages using ('R', 'biocDS', 'bioconductor', 'github', 'rforge')
3236 installable packages using ('R', 'biocDS', 'bioconductor', 'rforge')

2204 candidates on rforge
1061 installable packages using ('R', 'biocDS', 'rforge')
1115 installable packages using ('R', 'github', 'rforge')
1061 installable packages using ('R', 'rforge')
662 installable packages using ('R', 'bioconductor')
2068 installable packages using ('R', 'biocDS', 'cran', 'github', 'rforge')
1133 installable packages using ('R', 'bioconductor', 'github', 'rforge')
2057 installable packages using ('R', 'cran', 'rforge')
2053 installable packages using ('R', 'biocDS', 'bioconductor', 'cran')
1080 installable packages using ('R', 'bioconductor', 'rforge')
709 installable packages using ('R', 'biocDS', 'github')
1956 installable packages using ('R', 'biocDS', 'cran')
2065 installable packages using ('R', 'bioconductor', 'cran', 'github')
2048 installable packages using ('R', 'bioconductor', 'cran')
727 installable packages using ('R', 'bioconductor', 'github')
645 installable packages using ('R',)
1115 installable packages using ('R', 'biocDS', 'github', 'rforge')
662 installable packages using ('R', 'biocDS', 'bioconductor')
1974 installable packages using ('R', 'biocDS', 'cran', 'github')
2068 installable packages using ('R', 'cran', 'github', 'rforge')
1974 installable packages using ('R', 'cran', 'github')
709 installable packages using ('R', 'github')
2157 installable packages using ('R', 'bioconductor', 'cran', 'rforge')
2162 installable packages using ('R', 'biocDS', 'bioconductor', 'cran', 'rforge')
645 installable packages using ('R', 'biocDS')
2057 installable packages using ('R', 'biocDS', 'cran', 'rforge')
2167 installable packages using ('R', 'bioconductor', 'cran', 'github', 'rforge')
2070 installable packages using ('R', 'biocDS', 'bioconductor', 'cran', 'github')
1956 installable packages using ('R', 'cran')
727 installable packages using ('R', 'biocDS', 'bioconductor', 'github')
2172 installable packages using ('R', 'biocDS', 'bioconductor', 'cran', 'github', 'rforge')
1134 installable packages using ('R', 'biocDS', 'bioconductor', 'github', 'rforge')
1081 installable packages using ('R', 'biocDS', 'bioconductor', 'rforge')