(social4i size = „mic” align = „align-left”)
->
Doriți să vă împărtășiți conținutul pe R-Bloggers? Faceți clic aici dacă aveți un blog sau aici dacă nu.
A început ca un schimb simplu pe Mastodon. Aparent, ceea ce este firesc pentru creierul meu infuzat cu Nix poate părea îndepărtat pentru non-nixers. Versiuni multiple ale aceluiași pachet necesitate Fii posibil. Dar am încercat de fapt asta o singură dată, așa că am decis să -l documentez. Să ne tăiem la goană.
Tl; dr
Puteți instala într -adevăr același pachet de două ori (cu versiuni diferite), atât timp cât sunt pe căi diferite. Poate că sunteți deja familiarizați cu calea bibliotecii utilizatorilor (de exemplu, ~/R/4.5/
unde puteți instala pachete) și cel de sistem (de exemplu /usr/lib/R/site-library
unde numai rădăcina poate). Nu există niciun motiv pentru care nu puteți avea multe alte biblioteci de utilizatori și fiecare ar putea avea propriile sale
{tidyr}
Pachet, de exemplu. Trebuie doar să -l adăugați, ca așa:
paths_backup <- .libPaths() .libPaths(c("/home/user/my_fancy_new_R_lib", paths_backup))
Puteți instala un alt Tidyr în acea nouă bibliotecă.
url_tidyr100 <- "https://cran.r-project.org/src/contrib/Archive/tidyr/tidyr_1.0.0.tar.gz" install.packages( url_tidyr100, repos=NULL, type="source", lib = "/home/user/my_fancy_new_R_lib" )
Apoi, puteți alege ce versiune a unui pachet să vă încărcați cu
lib.loc
opțiunea library()
funcție (verificați ?library
pentru detalii). Puteți utiliza și detach()
Pentru a elimina acest pachet din calea de căutare și adăugați celălalt în aceeași sesiune.
Deci, cum arată acest lucru în practică?
Poate arăta foarte diferit, în funcție de modul de lucru. De când am descoperit Nix, nu -mi pot imagina o modalitate mai bună de a gestiona software -ul pe computerul meu, așa că voi folosi asta. Pentru a -mi face viața puțin mai ușoară, folosesc {rix}
Pachet pentru a demo asta. După cum vedeți în a treia linie, îi cer să creeze un mediu cu două
{tidyr}
-s.
rix::rix( r_ver = "4.5.0", r_pkgs = c("tidyr", "[email protected]"), ide = "radian", overwrite = TRUE, project_path = "./", print = FALSE )
Acest lucru va genera un default.nix
Fișier în directorul de lucru curent, care este un bun punct de plecare, dar trebuie modificat puțin. Conectez rezultatul final aici. Puteți descărca acest fișier, îl puteți pune într -un folder, instala NIX (nu vă faceți griji, nu rupe nimic) și faceți un nix-shell
comanda. Acum ești exact în același mediu ca mine. Am putea spune că suntem invitați. Minunat, zici? Știu.
Odată ce tastați radian
În consolă, puteți vedea că avem un .libPaths()
cu 49 de dosare; Fiecare pachet, pentru că așa funcționează Nix. Două dintre acestea sunt {tidyr}
. Să le găsim!
rpkgs <- installed.packages() (tidyr_liblocs <- setNames( object = rpkgs(rpkgs(,"Package") == "tidyr","LibPath"), nm = paste0("v", rpkgs(rpkgs(,"Package") == "tidyr","Version")) )) ## v1.3.1 ## "/nix/store/350xssybshpbpzi1kdryvgwh05kz910l-r-tidyr-1.3.1/library" ## v1.0.0 ## "/nix/store/42iyfzgjays8mdk3r9yzplamkjhz2as9-r-tidyr-1.0.0/library"
Între versiunile respective, constrângerea în replace_na()
Funcția a fost făcută ilegală, astfel încât să putem efectua un test rapid.
# Looks familiar? test_seq <- c(1, 1, 2, 3, NA, 8, 13) # Let's attach the old version first library( tidyr, lib.loc = tidyr_liblocs("v1.0.0") ) # Coerce numeric to string replace_na(test_seq, "5") ## (1) "1" "1" "2" "3" "5" "8" "13" # Save it for later old_replace_na <- replace_na # Let's detach this old tidyr detach("package:tidyr", character.only = TRUE) # and attach the newer one library( tidyr, lib.loc = tidyr_liblocs("v1.3.1") ) # Try to coerce numeric to string try(replace_na(test_seq, "5")) ## Error in vec_assign(data, missing, replace, x_arg = "data", value_arg = "replace") : ## Can't convert `replace` <character> to match type of `data` <double>. # Save it for later new_replace_na <- replace_na detach("package:tidyr", character.only = TRUE)
Deci, acest lucru funcționează așa cum era de așteptat. Dar acest atașat-detaș este un pic enervant. Am putea folosi cele două funcții în același timp, fără a fi nevoie să parcurgem o mulțime de hocus-pocus cu calea de căutare? Ei bine, ca să fiu sincer, nu puteam găsi cu adevărat o modalitate bună de a evita mai întâi să încarc pacakge sau spațiu de nume. Dacă tu do Știi să folosești ceva de genul getFromNamespace()
dar cu lib.loc
opţiune,
Vă rog, vă rog, anunțați -mă!
Deocamdată, am salvat doar funcțiile cu enquosurile lor, adică mediul lor în spațiul de nume al pachetului respectiv, care include alte funcții pe care le „le văd” și le folosesc. Ca atare, ele pot fi numite în viitor fără ciclul de atașare-detașare.
try(old_replace_na(test_seq, "5")) ## (1) "1" "1" "2" "3" "5" "8" "13" try(new_replace_na(test_seq, "5")) ## Error in vec_assign(data, missing, replace, x_arg = "data", value_arg = "replace") : ## Can't convert `replace` <character> to match type of `data` <double>.
Avertismente
În acest moment, puteți fi impresionat. Nu vă faceți griji, acest lucru este perfect normal. Cu toate acestea, trebuie să vă dezamăgesc: acest lucru nu va funcționa de fiecare dată, sau cel puțin nu atât de „ușor”. Când am încercat același lucru cu {tidyr}
versiunea 0.7.0, nu a reușit să instaleze deoarece curentul {purrr}
nu a exportat o funcție de care avea nevoie. Deci ar fi fost necesară modificări suplimentare. Aș fi trebuit să instalez mai vechi
{purrr}
faceți -l să depindă de asta, etc. Nu sunt sigur dacă este chiar posibil fără a redenumi întregul pachet.
Inițial, am vrut să scriu această postare cu {Seurat}
V3 vs v4 vs v5. Dar versiunile mai vechi nu au reușit să se instaleze din cauza dependențelor rupte, care au fost retrase de la CRAN de atunci. Pentru a rezuma, acest lucru va funcționa probabil doar pentru pachete relativ recente și simple. Pachetele cu multe dependențe sau cele care sunt foarte vechi sunt mai susceptibile să fie incompatibile cu depencențele lor actuale.
În aceste cazuri, este probabil mai productiv să creăm un mediu separat de o instantanee datată (de exemplu, RSTATS-on-NIX, POSIT PACKET MANAGER,
{groundhog}
sau similar). În acest fel, vă puteți testa întotdeauna scriptul, puteți face comparații sau orice ar fi obiectivul dvs.
Cu NIX, acesta este un lucru foarte natural de făcut, care asigură că toate mediile dvs. dev și va continua să funcționeze. În prezent, am 8 versiuni diferite de R, 5 Rstudios și 3 Dlyr-S instalate. Ei coexistă în mod pașnic și nu intră niciodată în conflict între ei. Dacă ceva trebuie testat pe diferite versiuni R, versiuni de pachete sau alte biblioteci, aceasta este o configurație excelentă.
Oferte R-Bloggers.com Actualizări zilnice prin e-mail Despre știri și tutoriale despre învățarea R și multe alte subiecte. Faceți clic aici dacă doriți să postați sau să găsiți o lucrare R/Data-Science.
Doriți să vă împărtășiți conținutul pe R-Bloggers? Faceți clic aici dacă aveți un blog sau aici dacă nu.
Continuați să citiți: Saem Pakej, difrint Vershunz: Pawsibl?