Supporting the Comprehension of Data Analysis Scripts

Florian Sihler, Oliver Gerstl, Lars Pfrenger, Julian Schubert, Matthias Tichy

View Original ↗
AI 導讀 technology infrastructure 重要性 4/5

flowR 擴充套件以平均 640 毫秒的速度分析 R 專案,透過正向切片將程式碼縮減至 13%,解決腳本難以重現的長期挑戰。

  • 影響切片功能可追蹤特定變數的下游流向,將平均分析範圍精簡至原始程式碼的 13%。
  • 內建 10 項專為腳本重現性設計的 Linting 規則,並支援絕對路徑轉相對路徑的自動修復。
  • 處理真實世界專案耗時中位數僅 251 毫秒,支援自動生成資料流與控制流等四種動態圖表。

資料分析腳本的複雜性與缺乏維護,常導致研究結果難以被第三方重現。為了解決 R 語言環境的長年挑戰,Ulm University 研究團隊推出了 flowR 擴充套件,能將分析特定輸入的程式碼範圍大幅縮減至原來的 13%。透過精確的跨程序資料流分析,flowR 處理真實世界專案的平均耗時僅需 640 毫秒,讓資料科學家能在 VS CodePositron 中獲得近乎即時的程式碼理解與除錯回饋。

整合 VS Code 擴充,flowR 解決重現性危機

多數研究高度依賴資料分析腳本來處理、清理與視覺化數據。然而近期研究指出,這些腳本往往缺乏標準化的工具支援,導致其難以被理解與維護,進而阻礙了科學研究的重現性(Reproducibility)。針對這項挑戰,開發團隊在先前靜態向後程式碼切片(Backward program slicer)的基礎上,推出了 flowR 的全新版本。

flowR 現已深度整合至熱門的資料分析整合開發環境(IDE),包含 PositronVS Code(涵蓋 vscode.dev 等瀏覽器版本)。有別於傳統的語法提示工具,flowR 專注於理解資料科學的工作流程,它透過增量分析 R 語言專案,交織跨程序的資料流與控制流分析,建構出完整的資料流圖(Dataflow Graph),藉此應對 R 語言動態且具備高度探索性的語法特徵。

除了提供即時的語法檢查與視覺化介面,flowR 也在開發過程中給予直接協助。研究人員不僅能透過該工具理解複雜的遺留程式碼,審查者也能更有效率地評估數據處理邏輯,確保分析結果具備高度的透明度與可重用性。

支援 Jupyter,影響切片將程式碼縮減至 13%

資料科學家大量使用筆記本(Notebook)格式進行交互式分析。為此,flowR 透過其外掛系統,原生支援了 Jupyter NotebooksQuarto 以及 R Markdown。系統會自動解析這些格式,提取單元格中的 R 程式碼,並將分析結果精準映射回筆記本中的對應位置,確保所有靜態分析與追蹤功能在筆記本環境中同樣有效。

其中最關鍵的新功能是「影響切片」(Impact Slicing,亦稱為正向切片)。當使用者選擇程式碼中的某個元素(例如特定的資料集)時,影響切片會列出所有受該輸入影響的下游程式碼。根據針對真實世界原始碼的測試,平均的正向切片能將專案範圍縮減至原始程式碼的 13%,大幅降低了追蹤特定輸入變數時的認知負載。

若將向後切片與影響切片結合(此過程稱為 Chopping),使用者能將分析範圍進一步濃縮,只留下連接「特定輸入」與「特定輸出」的程式碼片段。這讓研究人員能輕易回答這類問題:「這個 CSV 檔案的數據,究竟經歷了哪些處理步驟才產生這張圖表?」

內建 10 項 Linting 規則與懸停數值檢視

絕對路徑與未初始化的亂數種子,是破壞腳本可執行性的常見問題。flowR 內建了一組包含 10 項高度可配置的 Linting 規則,專門揪出阻礙腳本重現性的潛在錯誤。這些規則涵蓋了多種情境:包含無法跨系統移植的絕對路徑、無效的檔案位置、試圖存取資料框(Data frame)中不存在的欄位,以及未設定固定種子(Seed)就直接呼叫亂數生成器等。

為了加速修正流程,flowR 針對多數規則提供了快速修復(Quick-fixes)建議。例如,系統會根據專案的根目錄位置,自動將絕對路徑替換為相對路徑,且這套機制完全支援 R 語言的動態路徑建構特性。所有的 Linting 結果都會集中顯示於專屬面板,並允許使用者針對個別警告進行靜音或自訂配置。

此外,編輯器內建了懸停數值提供者(Hover-Over Value Provider)。當游標停留在變數或表達式上時,工具提示會顯示該點的推估數值或資料形狀。例如,即使程式碼尚未執行,flowR 也能透過靜態分析與不動點求解器(Fixpoint solver),顯示資料框的摘要形狀或推斷某變數為 [42L, 42L] 的整數區間,藉此提前預判欄位存取是否會發生錯誤。

自動生成四種回應式圖表,依賴視圖梳理流向

要快速掌握一份陌生腳本的架構,視覺化圖表是不可或缺的工具。flowR 能夠透過 mermaid.live,直接在編輯器內呈現多種類型的結構圖:包含正規化抽象語法樹(Normalized AST)、資料流圖(DFG)、呼叫圖(Call Graph)以及控制流圖(Control Flow Graph, CFG)。

這些圖表具備高度的響應式設計,會根據使用者在編輯器中的游標位置或選取範圍自動更新,並提供隱藏無效程式碼(Dead code)或切換緊湊顯示模式等微調選項。其中,控制流圖與呼叫圖特別有助於提供程式碼結構的鳥瞰視角,並釐清可能的執行路徑。

在專案層級,flowR 會自動生成並即時更新「依賴概覽」(Dependency Overview)。該視圖會將分析步驟分門別類,列出資料載入點、視覺化圖表、使用的函式庫以及最終輸出的檔案。若程式碼中的元素在語意上具有關聯(例如呼叫 abline 繪製線條與主要 plot 繪圖函式指向同一個圖形),系統會自動將它們分組。使用者點擊項目即可跳轉至原始碼,或透過右鍵選單直接觸發該依賴項的影響切片分析。

實測 4230 份腳本,總分析中位數僅 251 毫秒

為了驗證分析效能,研究團隊遵循了 ACM SIGPLAN 與 SIGSOFT 的經驗標準,針對 4,230 份來自學術論文附錄的真實世界 R 腳本進行了評估。在關閉多執行緒與快取的冷啟動(Cold-start)條件下,系統測量了建立跨程序資料流圖所需的時間與圖表規模。

實測數據顯示,使用 tree-sitter 後端(Backend)進行語法解析與正規化平均僅需 115 毫秒。在此基礎上建構資料流圖耗時約 525 毫秒,單一專案的總分析時間平均為 640 毫秒。值得注意的是,由於平均值受極端案例影響,總耗時的中位數實際上僅有 251 毫秒。平均而言,生成的資料流圖包含 1,733 個頂點與 3,738 條邊緣,中位數大小約為 213 KB

在此效能基礎上,包含 Linting 檢查、懸停檢視與切片生成等後續應用,通常只需額外耗費 10 至 100 毫秒。在實際應用中,藉由平行處理、延遲查詢執行與快取機制,flowR 能夠在約一秒內完成專案分析,提供極度流暢的即時反饋。

具備專案分析 API,支援 Docker 與靜態擴充

除了作為 IDE 的擴充套件,flowR 本身即是一個具備高度延展性的分析框架。該系統主要以 TypeScript 開發(部分包含 R 語言),提供了一套包含解析、正規化與資料/控制流分析的多步驟管線架構(Pipeline Architecture)。其正規化設計能產出與版本無關的 R 程式碼表示法,確保後續分析能精確對應回原始碼。

對於工具開發者而言,flowR 提供了 TCP 與 WebSocket 伺服器介面,並可透過 Docker 映像檔直接存取讀取-評估-列印迴圈(REPL)。系統的專案分析 API 負責統籌整個流程,內建的外掛系統能自動尋找專案檔案、識別最佳的載入順序,並解析特定檔案格式。

開發者也能利用其查詢 API(Query API)輕鬆建構客製化工具。舉例來說,透過呼叫 resolve value query,即可存取變數的推測數值;而利用 dependencies query 則能快速列出專案中使用的所有函式庫與外部依賴。這套具備型別安全的 API,為未來的靜態分析擴充奠定了穩健的基礎。

透過跨程序的資料流追蹤與動態即時反饋,flowR 將靜態分析轉化為直覺的編輯器體驗,為解決資料科學長期的腳本重現挑戰提供了實用路徑。

補充數據視覺化

flowR 平均資料流圖 (DFG) 規模與影響切片縮減率
指標數值
平均圖形頂點數 (Vertices)1733
平均圖形邊緣數 (Edges)3738
中位數圖形檔案大小213 KB
影響切片平均剩餘程式碼比例13%
單次 Linting 與切片查詢耗時範圍10-100 毫秒

Abstract

A lot of research relies on data analysis scripts to process, clean, and visualize data. However, recent studies show that these scripts are often hard to comprehend and maintain, hindering reproducibility and reuse, accompanied by a lack of tool support for handling such scripts. In this work, we focus on the R programming language, addressing this problem by presenting flowR as an extension for the common data analysis IDEs Positron and VS Code. Alongside a previously presented static backward program slicer, flowR provides an overview of data analysis scripts, interactive graph visualizations, linting, and inline value annotations to support data analysts. FlowR incrementally analyzes R projects by intertwining interprocedural data- and control-flow analyses to build a comprehensive dataflow graph, incorporating R's dynamic and explorative features. Additionally, flowR offers a plugin system and interfaces, allowing the integration of further analyses, such as new linting rules or custom visualizations. Requiring an average of 576ms to calculate the full dataflow graph of real-world projects, this enables near real-time feedback. The demonstration video is available at https://youtu.be/hJzr-r-NmMg . For the full source code and extensive documentation, refer to https://github.com/flowr-analysis/flowr . To try the docker image, use `docker run --rm -it eagleoutice/flowr`.