Get Bioc package list
suppressPackageStartupMessages ({
library (BiocPkgTools)
library (dplyr)
library (DT)
})
BiocManager:: version ()
pkg <- biocPkgList (repo = "BioCsoft" )
'getOption("repos")' replaces Bioconductor standard repositories, see 'help("repositories", package = "BiocManager")'
for details.
Replacement repositories:
CRAN: https://cloud.r-project.org
adding rname 'https://bioconductor.org/packages/3.23/bioc/VIEWS'
# pkg <- biocPkgList(repo = c("BioCsoft", "BioCann", "BioCexp", "BioCworkflows"))
Get licenses
sort (table (pkg$ License, useNA = "ifany" ))
AGPL (>= 3) AGPL-3 | file LICENSE
1 1
Apache License (== 2.0) + file LICENSE Apache License (== 2.0) | file LICENSE
1 1
Apache License (>= 2.0) Apache License 2.0 | file LICENSE
1 1
Artistic 2.0 Artistic-2.0 | GPL-2 + file LICENSE
1 1
BSD_3_clause CC BY-SA 4.0 + file LICENSE
1 1
CPL Creative Commons Attribution 4.0 International License
1 1
EPL (>= 1.0) GNU General Public License version 3
1 1
GPL (==2) GPL (>= 2.1)
1 1
GPL (>=2 ) GPL 3
1 1
GPL version 3 GPL-2 | GPL-3 | BSL-1.0
1 1
GPL-3 + file LICENCE GPL-3 bioconductor.org
1 1
GPL(>= 2) GPL(>=3)
1 1
LGPL (>= 2.1) | file LICENSE LGPL (>= 3.0)
1 1
LGPL (>= 3); File LICENSE LGPL-2.1
1 1
MIT | file LICENSE MIT License
1 1
Mozilla Public License 2.0 Unlimited
1 1
<NA> Apache License (== 2.0)
1 2
Artistic-1.0 Artistic-2.0 + file LICENSE
2 2
BSD 3-clause License + file LICENSE CC BY 4.0
2 2
CC BY-NC-ND 4.0 CC BY-NC-ND 4.0 + file LICENSE
2 2
CC0 CeCILL | file LICENSE
2 2
EPL GPL (>= 3.0)
2 2
GPL (>=2.0) GPL (>=3.0)
2 2
GPL (>2) GPL (http://www.gnu.org/copyleft/gpl.html)
2 2
GPL version 2 GPL Version 2 or later
2 2
LGPL (>= 2.1) LGPL (>=3)
2 2
LGPL-2.1 | file LICENSE LGPL-3 + file LICENSE
2 2
AGPL-3 + file LICENSE CeCILL
3 3
GPL (>= 2.0) GPL (>= 2) + file LICENSE
3 3
GPL (>=3) + file LICENSE Artistic License 2.0
3 4
GPL-2 + file LICENSE GPL-2 | file LICENSE
4 4
LGPL (>=2) MIT + file LICENCE
4 4
AGPL-3.0-only Apache License (>= 2)
5 5
Apache License 2.0 GPL (>= 3) + file LICENSE
5 5
GPL-2 | GPL-3 GPL(>=2)
5 5
LGPL-2 MIT
5 6
BSD_2_clause + file LICENSE LGPL (>= 2.0)
8 8
LGPL (>= 3) GPL (>=3)
8 9
Artistic-2.0 | file LICENSE GPL-3 | file LICENSE
13 14
BSD_3_clause + file LICENSE AGPL-3
16 17
LGPL (>= 2) GPL
18 21
LGPL-3 file LICENSE
36 39
LGPL GPL (>=2)
39 47
GPL-3 + file LICENSE GPL (>= 3)
62 72
GPL (>= 2) GPL-2
177 233
MIT + file LICENSE GPL-3
353 489
Artistic-2.0
521
Clean up
## Get unique licenses
lic <- unique (pkg$ License)
lic <- lic[! is.na (lic)]
alres <- lapply (structure (lic, names = lic), tools::: analyze_license)
## Get information about the licenses
alres <- do.call (dplyr:: bind_rows, lapply (names (alres), function (nm) {
a <- alres[[nm]]
data.frame (License = nm,
LicenseStandardizable = a$ is_standardizable,
LicenseVerified = a$ is_verified,
LicenseStandardization = a$ standardization,
LicenseCanonical = a$ is_canonical,
LicenseFOSS = a$ is_FOSS,
LicenseRestrictsUse = a$ restricts_use)
}))
## Add additional column removing the "+/| file LICENSE" part (if we want to
## assume that this is compatible with the main license indication)
alres$ LicenseStandardizationShort <- gsub ("[ ]* \\ +* \\ |*[ ]*file LICEN[SC]E" ,
"" , alres$ LicenseStandardization)
dim (alres)
length (unique (alres$ LicenseStandardizationShort))
DT:: datatable (alres,
extensions = "FixedColumns" ,
rownames = FALSE ,
options = list (scrollX = TRUE ,
fixedColumns = list (leftColumns = 1 ),
search = list (regex = FALSE , caseInsensitive = TRUE ),
pageLength = 20 ))
## Add license columns to pkg list
pkg <- pkg %>%
dplyr:: select (Package, Maintainer, License, hasLICENSE) %>%
dplyr:: left_join (alres, by = "License" )
dim (pkg)
DT:: datatable (pkg,
extensions = "FixedColumns" ,
rownames = FALSE ,
options = list (scrollX = TRUE ,
fixedColumns = list (leftColumns = 1 ),
search = list (regex = FALSE , caseInsensitive = TRUE ),
pageLength = 20 ))
Tabulate licenses
sort (table (pkg$ LicenseStandardizationShort, useNA = "ifany" ))
AGPL (>= 3) Apache License (>= 2.0)
1 1
Artistic-2.0 | GPL-2 CC BY-SA 4.0
1 1
CPL Creative Commons Attribution 4.0 International License
1 1
EPL (>= 1.0) GNU General Public License version 3
1 1
GPL (== 2) GPL (>= 2.1)
1 1
GPL-2 | GPL-3 | BSL-1.0 LGPL (>= 3.0)
1 1
MIT License Mozilla Public License 2.0
1 1
Unlimited Artistic-1.0
1 2
BSD 3-clause License CC BY 4.0
2 2
CC0 EPL
2 2
GPL (> 2) LGPL (>= 2.1)
2 3
LGPL-2.1 Apache License (== 2.0)
3 4
Artistic License 2.0 CC BY-NC-ND 4.0
4 4
GPL (>= 3.0) Apache License (>= 2)
4 5
CeCILL GPL (>= 2.0)
5 5
GPL-2 | GPL-3 LGPL-2
5 5
Apache License 2.0 BSD_2_clause
6 8
LGPL (>= 2.0) LGPL (>= 3)
8 10
<NA> BSD_3_clause
10 17
AGPL-3 GPL
21 21
LGPL (>= 2) LGPL-3
22 38
LGPL
39 39
GPL (>= 3) GPL (>= 2)
90 236
GPL-2 MIT
243 364
Artistic-2.0 GPL-3
537 568
Some cases that may need attention
We attempt to estimate the fraction of packages that are provided under an OSI approved license. It should be noted that, automatically performed, this will necessary be a rough estimate, e.g. since there are several packages that do not mention the license explicitly in the DESCRIPTION file but only provide the license text in a separate LICENSE file.
totalNbrPkg <- nrow (pkg)
ccLicensed <- pkg$ Package[grep ("CC|Creative Commons" , pkg$ LicenseStandardizationShort)]
fileLicense <- pkg$ Package[which (pkg$ LicenseStandardizationShort == "" )]
licUnlimited <- pkg$ Package[which (pkg$ LicenseStandardizationShort == "Unlimited" )]
licNotStandardizable <- pkg$ Package[is.na (pkg$ LicenseStandardizationShort)]
fractionOSIApproved <- 1 - length (unique (c (ccLicensed, fileLicense,
licUnlimited, licNotStandardizable)))/ totalNbrPkg
print (paste0 ("Rough estimate of fraction packages with OSI approved license: " ,
signif (100 * fractionOSIApproved, digits = 4 ), "%" ))
[1] "Rough estimate of fraction packages with OSI approved license: 97.45%"
Packages that have just a ‘file LICENSE’
These need to be checked manually.
.makeLinkToLicense <- function (pkg, text) {
sprintf ('<a href="%s" target="_blank"> %s</a>' ,
paste0 ("https://bioconductor.org/packages/devel/bioc/licenses/" ,
pkg, "/LICENSE" ),
text)
}
DT:: datatable (subset (pkg, LicenseStandardizationShort == "" ) %>%
dplyr:: mutate (License = vapply (seq_along (License), function (i) {
.makeLinkToLicense (Package[i], License[i])
}, "NA" )),
extensions = "FixedColumns" ,
rownames = FALSE ,
escape = FALSE ,
options = list (scrollX = TRUE ,
fixedColumns = list (leftColumns = 1 ),
search = list (regex = FALSE , caseInsensitive = TRUE ),
pageLength = 20 ))
Packages that have license “Unlimited”
DT:: datatable (subset (pkg, LicenseStandardizationShort == "Unlimited" ),
extensions = "FixedColumns" ,
rownames = FALSE ,
options = list (scrollX = TRUE ,
fixedColumns = list (leftColumns = 1 ),
search = list (regex = FALSE , caseInsensitive = TRUE ),
pageLength = 20 ))
Packages that have licenses that can not be standardized
Some of these may be false positives.
DT:: datatable (subset (pkg, is.na (LicenseStandardizationShort)),
extensions = "FixedColumns" ,
rownames = FALSE ,
options = list (scrollX = TRUE ,
fixedColumns = list (leftColumns = 1 ),
search = list (regex = FALSE , caseInsensitive = TRUE ),
pageLength = 20 ))
The rest of the licenses appear to be approved open source licenses (https://opensource.org/licenses/alphabetical ).
Session info
R Under development (unstable) (2026-02-08 r89382)
Platform: x86_64-pc-linux-gnu
Running under: Ubuntu 24.04.3 LTS
Matrix products: default
BLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3
LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.26.so; LAPACK version 3.12.0
locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 LC_PAPER=en_US.UTF-8 LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
time zone: Etc/UTC
tzcode source: system (glibc)
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] DT_0.34.0 dplyr_1.2.0 BiocPkgTools_1.29.2 htmlwidgets_1.6.4
loaded via a namespace (and not attached):
[1] xfun_0.56 bslib_0.10.0 httr2_1.2.2 gh_1.5.0 Biobase_2.71.0
[6] tzdb_0.5.0 vctrs_0.7.1 tools_4.6.0 crosstalk_1.2.2 bitops_1.0-9
[11] generics_0.1.4 stats4_4.6.0 curl_7.0.0 RUnit_0.4.33.1 tibble_3.3.1
[16] RSQLite_2.4.6 blob_1.3.0 pkgconfig_2.0.3 dbplyr_2.5.1 graph_1.89.1
[21] lifecycle_1.0.5 compiler_4.6.0 stringr_1.6.0 biocViews_1.79.1 htmltools_0.5.9
[26] sass_0.4.10 RCurl_1.98-1.17 yaml_2.3.12 jquerylib_0.1.4 pillar_1.11.1
[31] tidyr_1.3.2 cachem_1.1.0 tidyselect_1.2.1 rvest_1.0.5 digest_0.6.39
[36] stringi_1.8.7 purrr_1.2.1 fastmap_1.2.0 cli_3.6.5 magrittr_2.0.4
[41] RBGL_1.87.0 XML_3.99-0.22 readr_2.1.6 withr_3.0.2 filelock_1.0.3
[46] rappdirs_0.3.4 bit64_4.6.0-1 lubridate_1.9.5 timechange_0.4.0 rmarkdown_2.30
[51] httr_1.4.7 igraph_2.2.1 bit_4.6.0 otel_0.2.0 hms_1.1.4
[56] memoise_2.0.1 evaluate_1.0.5 knitr_1.51 BiocFileCache_3.1.0 rlang_1.1.7
[61] glue_1.8.0 DBI_1.2.3 BiocManager_1.30.27 xml2_1.5.2 BiocGenerics_0.57.0
[66] jsonlite_2.0.0 R6_2.6.1