Rlang - Tek Satırda Çoklu Paket Yönetimi

R programlama dilinde, kullanacağımız paketleri duruma göre library() ve/veya require() fonksiyonları ile çağırırız. Elbette, genel kullanım library() fonksiyonudur. Çünkü, require() koduna baktığımızda bu fonksiyonun da arkaplanda library() fonksiyonunu kullandığını görebiliriz1 2.

AA

Konuyla ilgili olarak yazının alt bölümünde yer alan ileri okumalar başlığına göz atabilirsiniz.

library(package, help, pos = 2, lib.loc = NULL,
        character.only = FALSE, logical.return = FALSE,
        warn.conflicts = TRUE, quietly = FALSE,
        verbose = getOption("verbose"))

require(package, lib.loc = NULL, quietly = FALSE,
        warn.conflicts = TRUE,
        character.only = FALSE)

R Dili'nde Paket Yönetimi

Kullanımımız hangi fonksiyon olursa olsun, kodumuz içerisinde ihtiyaç duyduğumuz her paket için ayrı ayrı tanımlanma yapmak durumundayız. Elbette, sadece ihtiyacınız olduğunda bir paketi kullanmak isteyebilir ve kodun ilk satırları yerine paketi gerekli zamanda çağırabilirsiniz. Birkaç paket için sorun olmayan bu durum paket sayısına paralel olarak canınızı sıkabilir.

library(dplyr)
library(ggplot2)
library(RMySQL)
library(data.table)
...

Peki, bu durumun bir çözümü var mı? Elbette, var.

lapply

lapply çözümlerden biri. Aldığı değeri bir sonraki argümana aktararak, liste ve vector boyunca bir fonksiyonun uygulanması sağlayan lapply ile belirttiğiniz paketlerin tek satır üzerinden yüklenmesini sağlayabiliriz. Fonksiyonun temel kullanımı şu şekilde:

lapply(.x, .f, ...)
  1. .x: Vektör
  2. .f: Uygulanacak fonksiyon
  3. …: .f için uygulanacak ek opsiyonel argümanlar

lapply kullanımına dair bir örnek oluşturmak gerekirse aynı satır üzerinden devtools ve grid paketlerini indirebiliriz.

lapply(c("...", "..."), require, character.only = TRUE)

Komut sonrasında alacağınız dönüş şu şekilde olacaktır:

lapply(c("devtools", "grid"), require, character.only = TRUE)
Loading required package: devtools
Loading required package: grid
[[1]]
[1] TRUE

[[2]]
[1] TRUE

Eğer aktifleştireceğiniz paket yüklü değilse install.packages için False dönüşü alırsınız.

lapply(c("arutil", "googleformr"), require, character.only = TRUE)
Loading required package: arutil
Loading required package: googleformr
[[1]]
[1] TRUE

[[2]]
[1] FALSE

Warning message:
In library(package, lib.loc = lib.loc, character.only = TRUE, logical.return = TRUE,  :
  there is no package called ‘googleformr’

pacman

pacman R paket yönetimi sürecini oldukça kolaylaştıran oldukça başarılı paketlerden biri.

p_load fonksiyonuyla birlikte tek satır üzerinden çoklu paket yükleme ve aktifleştirme işlemlerini yürütebilmekte. Yukarıdaki lapply örneğinde karşılaştığımız, tanımlanan paketin yüklü olmaması durumunda false dönüşü yerine paketin indirip aktifleştirilmekte. pacman ve barındırdığı fonksiyonlarla ilgili daha geniş bilgiye CRAN ulaşabilirsiniz3. Fonksiyon kullanımlarını ise şu şekilde örneklendirebiliriz.

library(pacman)
pacman::p_load(dplyr, psych, tm) # ön tanımlı kullanım
p_load_gh("Dasonk/githubSearch", "trinker/regexr", "hadley/httr@v0.4") # github üzerinden paket edinimi

lubripack

Bir diğer alternatif paket ise lubripack. Paket işlev olarak belirtilen paketler yüklü ise aktifleştirmekte, yüklü olmayan paketleri yükleyerek kullanıma hazır hale getirmekte. Aktif olarak geliştirilmeyen, ancak kaynak kodlarını github sayfasın üzerinden görüntüleyerek geliştirmeye devam edebileceğiniz pakete GitHub üzerinden ulaşabilirsiniz4.

library(devtools)
devtools::install_github("espanta/lubripack")
library(lubripack)
lubripack("anytime", "animation", "adabagL", silent = FALSE)

easypackages

Her paketi library fonksiyonuyla ilişkili olarak aktifleştiren, sahip olunmayan paketlerin de yüklenmesini sağlayan easypackages paketi libraries ve packages fonksiyonları üzerinden yönetilebilmekte. Daha detaylı bilgi için GitHub sayfasını inceleyebilirsiniz5. İndirme ve kullanımına dair örnekler ise şu şekilde:

install.packages("easypackages")
library(easypackages)
libraries("dplyr", "ggplot2")
paketlerim <- c("RMySQL", "Rdatatable/data.table")
packages(paketlerim)

Elbette basit bir işlem için harici paketlere ne kadar ihtiyaç olduğu ve/veya bunun ne kadar işlevsel olacağı tartışılabilir. Ancak, paketleri dinamik olarak iletmeniz veya kodunuzu farklı bir ortamda çalıştırmak durumunda olabilirsiniz. Bu tür durumlarda elbette standart yolların dışına çıkmamız gerekebilmekte.