Viitorul s -a îmbunătățit la găsirea variabilelor globale

URMĂREȘTE-NE
16,065FaniÎmi place
1,142CititoriConectați-vă

(Acest articol a fost publicat pentru prima dată pe Jottr pe rși a contribuit cu drag la R-Bloggers). (Puteți raporta problema despre conținutul de pe această pagină aici)


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.

Zidul balonului hexlogo „viitor”

viitor Pachetul sărbătorește zece ani pe CRAN începând cu 19 iunie 2025. Aceasta este prima dintr -o serie de postări pe blog care evidențiază îmbunătățiri recente la futureverse Ecosistem.

Globaluri Pachetul face parte din Futureverse și a avut două versiuni recente la 2025-04-15 și 2025-05-08. Aceste actualizări abordează câteva cazuri de colț care altfel ar duce la erori neașteptate. De asemenea, au rezultat în mai multe probleme lungi și restante raportate la
viitor, viitor.apply, Furrrși dofutură
Trackerii de emitere a pachetului, și în alte părți, ar putea fi închise.

Actualizarea semnificativă este că findGlobals() a obținut argument
method = "dfs"care găsește Globals în expresiile R, mergând arborele său de sintaxă abstract (AST) folosind un Primul căutare în profunzime
Algoritm. Această nouă abordare face o treabă mai bună de a emite modul în care motorul R identifică variabilele globale, ceea ce duce la o călătorie și mai lină pentru oricine folosește Futureverse pentru procesare paralelă și distribuită. Anterior, un algoritm de căutare modificat adoptat de la codetools::findGlobals() a fost folosit. Codetools
Algoritmul de căutare este proiectat în principal pentru R CMD check pentru a detecta variabile nedefinite utilizate în codul pachetului. Pentru a limita numărul de falsuri pozitive raportate de R CMD checkastfel de algoritmi tind să fie „conservatori” prin natură, astfel încât să putem avea încredere în ceea ce este raportat. Această strategie nu este întotdeauna suficientă pentru detectarea automată a globalilor necesare în procesarea paralelă. Ca exemplu, în

fcn <- function() { 
  a <- b
  b <- 1 
}

variabil b este o variabilă globală, dar dacă ne întrebăm Codetoolsnu ridică b ca global;

codetools::findGlobals(fun)
#> (1) "{"  "<-"

Acest fals negativ este în regulă pentru R CMD checkdar, în schimb, pentru procesarea paralelă, trebuie să folosim un algoritm de căutare „liberal”. În procesare paralelă, este în regulă să ridici și să exporte prea multe variabile către lucrătorul paralel. Dacă nu se folosește o variabilă, se face puțin prejudiciu, dar dacă nu vom exporta o variabilă necesară, vom ajunge la o eroare cu obiect-nu-fund. Futureverse a folosit încă din primele zile (decembrie 2015) o versiune modificată a Codetools
algoritm care este liberal, dar nu prea liberal. Detectează b ca variabilă globală;

globals::findGlobals(fun)
#> (1) "{"  "<-" "b"

Această strategie de căutare liberală se dovedește a funcționa surprinzător de bine pentru detectarea globalelor necesare în procesarea paralelă, dar au existat cazuri de colț în care a eșuat. De exemplu, futureverse s -a străduit să identifice variabilele globale în cazuri precum:

library(future)
plan(multisession, workers = 2)

x <- 2

f <- future(local({
  h <- function(x) -x
  h(x)
}))
value(f)

ceea ce a dus la

Error in eval(quote({ : object 'x' not found

Acest lucru se datorează faptului că există mai multe variabile diferite numite xiar cel din mediul de apel este „mascat” de argument xceea ce rezultă în x Nu fiți niciodată ridicat și exportat la lucrătorul paralel.

S -ar putea să pară ca și cum acest tip de cod ar fi fost curat cu atenție pentru a eșua, dar rareori, dacă este deloc, ar fi observat în cod real. De fapt, aceasta este o versiune distilată a unui scenariu mare din lumea reală raportată de cel puțin o persoană. Este datorită unui astfel de feedback că împreună putem aduce îmbunătățiri futureverse ecosistem 🙏 Nu pot ști sigur, dar aș bănui că acest lucru a afectat deja mai mulți dezvoltatori R – viitor Pachetul este până la urmă printre cele mai multe pachete de 0,6% descărcate și există 1.300 de pachete care „au nevoie” din mai 2025. Problema de mai sus a fost rezolvată în Globaluri 0,18,0 (2025-05-08) și viitor 1.49.0 (2025-05-09), care acum folosesc noul findGlobals(..., method = "dfs") Strategia de căutare internă. După actualizarea acestor pachete, fragmentul de cod de mai sus ne oferă

value(f)
#> (1) -2

Așa cum ne -am aștepta.

O altă soluție de eroare a cazurilor de colț este unde

library(future)
library(magrittr)
x <- list()
f <- future ({ x %>% `$<-`("a", 42) })

ar duce la eroarea destul de obscură

Error in e((4)) : subscript out of bounds

Acest lucru se datorează unei erori în
Codetools pachet, care Globaluri (> = 0,17,0) (2025-04-15) funcționează în jur. După actualizare, lucrurile funcționează așa cum era de așteptat;

f <- future ({ x %>% `$<-`("a", 42) })
value(f)
#> $a
#> (1) 42

Încă o soluție în Globaluri (> = 0.17.0) este că versiunile anterioare ar arunca o eroare dacă ar intra într -un obiect S7. Clasa de obiect S7 a fost introdusă în 2023.

Fie ca viitorul să fie cu tine!

Henrik

PS. Știați că Codetools Pachetul este scris folosind programarea alfabetizată în urma viziunii lui Donald Knuth? Îngrijit, nu? Și, este aproape ca și cum ar fi fost codificat, dar cu partea de modele de mare limbă (LLM) fiind înlocuită de cunoștințe și expertiză umană 🤓

Dominic Botezariu
Dominic Botezariuhttps://www.noobz.ro/
Creator de site și redactor-șef.

Cele mai noi știri

Pe același subiect

LĂSAȚI UN MESAJ

Vă rugăm să introduceți comentariul dvs.!
Introduceți aici numele dvs.