@eagleoutice/flowr

中文文档
2.17.6发布于 2026/11/13ISCTypeScriptCommonJS构建来源已验证近 30 天下载 9409

R 编程语言的静态数据流分析器和程序扫描器

中文使用文档
文档目录6 节
  1. 开始
  2. 更多信息
  3. * 关于流程R的出版物
  4. 捐款
  5. 贡献者
  6. 生成通知

flowR logo
QA (and potentially deploy) codecov Docker Image Version (latest semver) latest tag Marketplace Marketplace DOI

流量R 是一个复杂的,静态的 数据流分析器 联 合 国 R 编程语言, (中文(简体) ), 可用时间 虚拟系统, (中文(简体) ), 波西特龙, (中文(简体) ), 斯图迪奥, (中文(简体) ), 财务报告和审定财务报表 夹克。 。 。 . 它具有各种各样的特点,例如:

  • 📚 依赖性分析
    鉴于你的分析项目,流程R提供了大量所谓的 查询 获取更多关于您的代码的信息. 一个重要的问题是 依赖性查询,它显示您需要的图书馆, 它读取的数据文件、它来源的脚本以及它输出的数据. 在此基础上 猜测依赖性版本查询 缩小每个版本的范围 在这些图书馆中,通过将项目申报的限制与实际调用代码的功能结合起来,必须具备这些功能. (单位:千美元) XQ 在浏览器中探索 (中文(简体) )

    示例:有流量R的依赖性分析

    以下显示该表的依赖视图 视觉工作室代码扩展数字 :

    Dependency Analysis

  • 🐞 代码折叠
    为常见问题和潜在错误分析您的 R 脚本( 见 维基页面 以获取关于当前支持的接口的更多信息. (单位:千美元) XQ 在浏览器中探索 (中文(简体) )

    示例: 有流程R 的 Linting 代码

    要插入代码,你可以使用 回复 或 视觉工作室代码扩展 (见 vscode-flowr # 283 (英语)) (中文(简体) ).

    $ docker run -it --rm eagleoutice/flowr # or npm run flowr 
    flowR repl v2.17.5, R grammar v14 (tree-sitter engine)
    R> :query @linter "read.csv(\"/root/x.txt\")"
    
    产出
    Query: linter (19 ms)
       ╰ File Path Validity (file-path-validity):
           ╰ certain:
               ╰ Path `/root/x.txt` at 1.1-23
       ╰ Absolute Paths (absolute-file-paths):
           ╰ certain:
               ╰ Path `/root/x.txt` at 1.1-23
       ╰ +21 rules with no findings (:query to see all)
    All queries together required ≈19 ms (1ms accuracy, total 19 ms)
    

    电筒会分析代码 并返回任何发现的问题. 格式更为优美,此返回 :

    [ { "type": "linter" } ]
    

    (可缩短为: @linter 当使用 REPL 命令时 :query) (中文(简体) ).

    成果(预测和总结):

    查询 : 线性 (22分钟)
       现 数 文件路径有效性 (档案-病理):
           确定为:
               路径 /root/x.txt 第1.1至23号
       现 数 绝对路径 (绝对-文件-路径):
           确定为:
               路径 /root/x.txt 第1.1至23号
       现 数 +21 规则,没有定论(:query * 见所有规则)
    所有查询加在一起需要22毫秒(1毫秒精确度,共计23毫秒)

    作为 Json 显示详细结果

    分析(包括解析和正常化以及查询)是在生成环境中进行的.

    JSON包含有关节点的ID(参见: 接口 维基页面.

    {"linter":{"results":{"deprecated-functions":{"results":[],".meta":{"builtin":0,"sigdb":0}},"file-path-validity":{"results":[{"involvedId":3,"loc":[1,1,1,23],"filePath":"/root/x.txt","certainty":"certain"}],".meta":{"totalReads":1,"totalUnknown":0,"totalWritesBeforeAlways":0,"totalValid":0}},"seeded-randomness":{"results":[],".meta":{"consumerCalls":0,"callsWithFunctionProducers":0,"callsWithAssignmentProducers":0,"callsWithNonConstantProducers":0,"callsWithOtherBranchProducers":0}},"absolute-file-paths":{"results":[{"certainty":"certain","filePath":"/root/x.txt","loc":[1,1,1,23]}],".meta":{"totalConsidered":1,"totalUnknown":0}},"unused-definitions":{"results":[],".meta":{"totalConsidered":0}},"network-functions":{"results":[],".meta":{"totalCalls":0,"totalFunctionDefinitions":0}},"dataframe-access-validation":{"results":[],".meta":{"numOperations":0,"numAccesses":0,"totalAccessed":0}},"dead-code":{"results":[],".meta":{}},"useless-loop":{"results":[],".meta":{"numOfUselessLoops":0}},"problematic-inputs":{"results":[],".meta":{}},"stop-call":{"results":[],".meta":{"consideredNodes":0}},"roxygen-arguments":{"results":[],".meta":{}},"no-leaked-credentials":{"results":[],".meta":{"totalChecked":1}},"undefined-symbol":{"results":[],".meta":{"totalFunctionCalls":1,"totalVariableUses":0,"suppressed":{"installed":0,"loadedPackage":0,"enclosingScope":0,"nonStandardEval":0,"subscript":0,"unresolvedLibrary":0,"declaredGlobal":0}}},"unused-import":{"results":[],".meta":{"totalConsidered":0,"totalUnresolved":0,"totalMultiPackage":0,"totalUnused":0}},"unclosed-connection":{"results":[],".meta":{"totalOpened":0,"totalClosed":0}},"overwritten-file":{"results":[],".meta":{"totalFiles":0}},"unescaped-arguments":{"results":[],".meta":{"totalCriticalArguments":0,"totalEscapedArguments":0}},"namespace-access":{"results":[],".meta":{"unresolved":0}},"secret-exfiltration":{"results":[],".meta":{"secretSinkCalls":0}},"process-state-in-session":{"results":[],".meta":{"sessionFunctions":0}},"call-contracts":{"results":[],".meta":{"checkedCalls":0}},"interactive-functions":{"results":[],".meta":{"totalCalls":0,"totalFunctionDefinitions":0}}},".meta":{}},".meta":{}}
    
  • 🍕 程序切换
    鉴于一个点 像一个情节的可视化, 流量R 将程序缩小为仅相关部分 用于计算利息点. (单位:千美元) XQ 在浏览器中探索 (中文(简体) )

    示例:用流线切换

    最简单的取回切片的方法是用流管 视觉工作室代码扩展。 。 。 . 不过,你可以使用 回复 还有. 如果您想要在另一个上下文中重新使用现有分析的特定部分, 或者您想要理解的话, 这可以帮助您 密码里发生的事.

    为此,让我们看看位于 测试/测试文件/实例R数字 :

    sum <- 0
    product <- 1
    w <- 7
    N <- 10
    
    for (i in 1:(N-1)) {
      sum <- sum + i + w
      product <- product * i
    }
    
    cat("Sum:", sum, "\n")
    cat("Product:", product, "\n")
    

    让我们假设我们只对 sum 以第11行印制. 要获得此切片, 您可以使用以下命令 :

    $ docker run -it --rm eagleoutice/flowr # or npm run flowr 
    flowR repl v2.17.5, R grammar v14 (tree-sitter engine)
    R> :query @static-slice (11@sum) file://test/testfiles/example.R
    
    产出
    sum <- 0
    w <- 7
    N <- 10
    for(i in 1:(N-1)) sum <- sum + i + w
    sum
    All queries together required ≈19 ms (1ms accuracy, total 20 ms)
    
  • 🚀 快速书法、数据和控制流程图
    在刚刚 103.7分/秒 (截至2026年11月8日), (中文(简体) ), 流量R 可以分析平均真实世界R脚本的数据与控制流量. 见 基准 欲了解更多信息, 并咨询 维基页面 详细情况 数据流图 以及 调用图表。 。 。 . (单位:千美元) XQ 在浏览器中探索 (中文(简体) )

    示例:生成带有流程R的数据流图

    您可以使用 回复。 。 。 . 诸如 :dataflow* 允许您查看 数据流图 用于给定的 R 脚本.

    举一例曰:

    sum <- 0
    product <- 1
    w <- 7
    N <- 10
    
    for (i in 1:(N-1)) {
      sum <- sum + i + w
      product <- product * i
    }
    
    cat("Sum:", sum, "\n")
    cat("Product:", product, "\n")
    

    为了得到 数据流图 对于此脚本,您可以使用以下命令:

    $ docker run -it --rm eagleoutice/flowr # or npm run flowr 
    flowR repl v2.17.5, R grammar v14 (tree-sitter engine)
    R> :dataflow* test/testfiles/example.R
    
    产出
    'test/testfiles/example.R' looks like a path, analyzing file://test/testfiles/example.R (repl.autoUseFileProtocol is set).
    https://mermaid.live/view#base64:eyJjb2RlIjoiZmxvd2NoYXJ0IFREXG4gICAgMXt7XCJgKiM5MTtSTnVtYmVyIzkzOyogKiowKipcbiAgICAgICoxLjgqICgqKmlkOiAxKiopYFwifX1cbiAgICAwW1wiYCojOTE7UlN5bWJvbCM5MzsqICoqc3VtKipcbiAgICAgICoxLjEtMyogKCoqaWQ6IDAqKiwgdjogMSlgXCJdXG4gICAgMltbXCJgKiM5MTtSQmluYXJ5T3AjOTM7KiBiYXNlIzU4OyM1ODsqKiM2MDsjNDU7KipcbiAgICAgICoxLjEtOCogKCoqaWQ6IDIqKilcbiAgICBhcmc6ICgwLCAxKWBcIl1dXG4gICAgYnVpbHQtaW46XzYwXy1bXCJgQnVpbHQtSW46XG4jNjA7IzQ1O2BcIl1cbiAgICBzdHlsZSBidWlsdC1pbjpfNjBfLSBzdHJva2U6Z3JheSxmaWxsOmdyYXksc3Ryb2tlLXdpZHRoOjJweCxvcGFjaXR5Oi44O1xuICAgIDR7e1wiYCojOTE7Uk51bWJlciM5MzsqICoqMSoqXG4gICAgICAqMi4xMiogKCoqaWQ6IDQqKilgXCJ9fVxuICAgIDNbXCJgKiM5MTtSU3ltYm9sIzkzOyogKipwcm9kdWN0KipcbiAgICAgICoyLjEtNyogKCoqaWQ6IDMqKiwgdjogNClgXCJdXG4gICAgNVtbXCJgKiM5MTtSQmluYXJ5T3AjOTM7KiBiYXNlIzU4OyM1ODsqKiM2MDsjNDU7KipcbiAgICAgICoyLjEtMTIqICgqKmlkOiA1KiopXG4gICAgYXJnOiAoMywgNClgXCJdXVxuICAgIDd7e1wiYCojOTE7Uk51bWJlciM5MzsqICoqNyoqXG4gICAgICAqMy42KiAoKippZDogNyoqKWBcIn19XG4gICAgNltcImAqIzkxO1JTeW1ib2wjOTM7KiAqKncqKlxuICAgICAgKjMuMSogKCoqaWQ6IDYqKiwgdjogNylgXCJdXG4gICAgOFtbXCJgKiM5MTtSQmluYXJ5T3AjOTM7KiBiYXNlIzU4OyM1ODsqKiM2MDsjNDU7KipcbiAgICAgICozLjEtNiogKCoqaWQ6IDgqKilcbiAgICBhcmc6ICg2LCA3KWBcIl1dXG4gICAgMTB7e1wiYCojOTE7Uk51bWJlciM5MzsqICoqMTAqKlxuICAgICAgKjQuNi03KiAoKippZDogMTAqKilgXCJ9fVxuICAgIDlbXCJgKiM5MTtSU3ltYm9sIzkzOyogKipOKipcbiAgICAgICo0LjEqICgqKmlkOiA5KiosIHY6IDEwKWBcIl1cbiAgICAxMVtbXCJgKiM5MTtSQmluYXJ5T3AjOTM7KiBiYXNlIzU4OyM1ODsqKiM2MDsjNDU7KipcbiAgICAgICo0LjEtNyogKCoqaWQ6IDExKiopXG4gICAgYXJnOiAoOSwgMTApYFwiXV1cbiAgICAxMltcImAqIzkxO1JTeW1ib2wjOTM7KiAqKmkqKlxuICAgICAgKjYuNiogKCoqaWQ6IDEyKiosIHY6IDIwKWBcIl1cbiAgICAxM3t7XCJgKiM5MTtSTnVtYmVyIzkzOyogKioxKipcbiAgICAgICo2LjExKiAoKippZDogMTMqKilgXCJ9fVxuICAgIDE2KFtcImAqIzkxO1JTeW1ib2wjOTM7KiAqKk4qKlxuICAgICAgKjYuMTQqICgqKmlkOiAxNioqKWBcIl0pXG4gICAgMTd7e1wiYCojOTE7Uk51bWJlciM5MzsqICoqMSoqXG4gICAgICAqNi4xNiogKCoqaWQ6IDE3KiopYFwifX1cbiAgICAxOFtbXCJgKiM5MTtSQmluYXJ5T3AjOTM7KiBiYXNlIzU4OyM1ODsqKiM0NTsqKlxuICAgICAgKjYuMTQtMTYqICgqKmlkOiAxOCoqKVxuICAgIGFyZzogKDE2LCAxNylgXCJdXVxuICAgIGJ1aWx0LWluOi1bXCJgQnVpbHQtSW46XG4jNDU7YFwiXVxuICAgIHN0eWxlIGJ1aWx0LWluOi0gc3Ryb2tlOmdyYXksZmlsbDpncmF5LHN0cm9rZS13aWR0aDoycHgsb3BhY2l0eTouODtcbiAgICAxOVtbXCJgKiM5MTtSRXhwcmVzc2lvbkxpc3QjOTM7KiBiYXNlIzU4OyM1ODsqKigqKlxuICAgICAgKjYuMTMqICgqKmlkOiAxOSoqKVxuICAgIGFyZzogKDE4KWBcIl1dXG4gICAgYnVpbHQtaW46XzQwX1tcImBCdWlsdC1JbjpcbihgXCJdXG4gICAgc3R5bGUgYnVpbHQtaW46XzQwXyBzdHJva2U6Z3JheSxmaWxsOmdyYXksc3Ryb2tlLXdpZHRoOjJweCxvcGFjaXR5Oi44O1xuICAgIDIwW1tcImAqIzkxO1JCaW5hcnlPcCM5MzsqIGJhc2UjNTg7IzU4OyoqIzU4OyoqXG4gICAgICAqNi4xMS0xNyogKCoqaWQ6IDIwKiopXG4gICAgYXJnOiAoMTMsIDE5KWBcIl1dXG4gICAgYnVpbHQtaW46OltcImBCdWlsdC1JbjpcbiM1ODtgXCJdXG4gICAgc3R5bGUgYnVpbHQtaW46OiBzdHJva2U6Z3JheSxmaWxsOmdyYXksc3Ryb2tlLXdpZHRoOjJweCxvcGFjaXR5Oi44O1xuICAgIDI0KFtcImAqIzkxO1JTeW1ib2wjOTM7KiAqKnN1bSoqXG4gICAgICAqNy4xMC0xMiogKCoqaWQ6IDI0KiosIDM2KylgXCJdKVxuICAgIDI1KFtcImAqIzkxO1JTeW1ib2wjOTM7KiAqKmkqKlxuICAgICAgKjcuMTYqICgqKmlkOiAyNSoqLCAzNispYFwiXSlcbiAgICAyNltbXCJgKiM5MTtSQmluYXJ5T3AjOTM7KiBiYXNlIzU4OyM1ODsqKiM0MzsqKlxuICAgICAgKjcuMTAtMTYqICgqKmlkOiAyNioqLCAzNispXG4gICAgYXJnOiAoMjQsIDI1KWBcIl1dXG4gICAgYnVpbHQtaW46XzQzX1tcImBCdWlsdC1JbjpcbiM0MztgXCJdXG4gICAgc3R5bGUgYnVpbHQtaW46XzQzXyBzdHJva2U6Z3JheSxmaWxsOmdyYXksc3Ryb2tlLXdpZHRoOjJweCxvcGFjaXR5Oi44O1xuICAgIDI3KFtcImAqIzkxO1JTeW1ib2wjOTM7KiAqKncqKlxuICAgICAgKjcuMjAqICgqKmlkOiAyNyoqLCAzNispYFwiXSlcbiAgICAyOFtbXCJgKiM5MTtSQmluYXJ5T3AjOTM7KiBiYXNlIzU4OyM1ODsqKiM0MzsqKlxuICAgICAgKjcuMTAtMjAqICgqKmlkOiAyOCoqLCAzNispXG4gICAgYXJnOiAoMjYsIDI3KWBcIl1dXG4gICAgMjNbXCJgKiM5MTtSU3ltYm9sIzkzOyogKipzdW0qKlxuICAgICAgKjcuMy01KiAoKippZDogMjMqKiwgMzYrLCB2OiAyOClgXCJdXG4gICAgMjlbW1wiYCojOTE7UkJpbmFyeU9wIzkzOyogYmFzZSM1ODsjNTg7KiojNjA7IzQ1OyoqXG4gICAgICAqNy4zLTIwKiAoKippZDogMjkqKiwgMzYrKVxuICAgIGFyZzogKDIzLCAyOClgXCJdXVxuICAgIDMxKFtcImAqIzkxO1JTeW1ib2wjOTM7KiAqKnByb2R1Y3QqKlxuICAgICAgKjguMTQtMjAqICgqKmlkOiAzMSoqLCAzNispYFwiXSlcbiAgICAzMihbXCJgKiM5MTtSU3ltYm9sIzkzOyogKippKipcbiAgICAgICo4LjI0KiAoKippZDogMzIqKiwgMzYrKWBcIl0pXG4gICAgMzNbW1wiYCojOTE7UkJpbmFyeU9wIzkzOyogYmFzZSM1ODsjNTg7KiojNDI7KipcbiAgICAgICo4LjE0LTI0KiAoKippZDogMzMqKiwgMzYrKVxuICAgIGFyZzogKDMxLCAzMilgXCJdXVxuICAgIGJ1aWx0LWluOl80Ml9bXCJgQnVpbHQtSW46XG4jNDI7YFwiXVxuICAgIHN0eWxlIGJ1aWx0LWluOl80Ml8gc3Ryb2tlOmdyYXksZmlsbDpncmF5LHN0cm9rZS13aWR0aDoycHgsb3BhY2l0eTouODtcbiAgICAzMFtcImAqIzkxO1JTeW1ib2wjOTM7KiAqKnByb2R1Y3QqKlxuICAgICAgKjguMy05KiAoKippZDogMzAqKiwgMzYrLCB2OiAzMylgXCJdXG4gICAgMzRbW1wiYCojOTE7UkJpbmFyeU9wIzkzOyogYmFzZSM1ODsjNTg7KiojNjA7IzQ1OyoqXG4gICAgICAqOC4zLTI0KiAoKippZDogMzQqKiwgMzYrKVxuICAgIGFyZzogKDMwLCAzMylgXCJdXVxuICAgIDM1W1tcImAqIzkxO1JFeHByZXNzaW9uTGlzdCM5MzsqIGJhc2UjNTg7IzU4OyoqIzEyMzsqKlxuICAgICAgKjYuMjAqICgqKmlkOiAzNSoqLCAzNispXG4gICAgYXJnOiAoMjksIDM0KWBcIl1dXG4gICAgYnVpbHQtaW46XzEyM19bXCJgQnVpbHQtSW46XG4jMTIzO2BcIl1cbiAgICBzdHlsZSBidWlsdC1pbjpfMTIzXyBzdHJva2U6Z3JheSxmaWxsOmdyYXksc3Ryb2tlLXdpZHRoOjJweCxvcGFjaXR5Oi44O1xuICAgIDM2W1tcImAqIzkxO1JGb3JMb29wIzkzOyogYmFzZSM1ODsjNTg7Kipmb3IqKlxuICAgICAgKjYuMS05LjEqICgqKmlkOiAzNioqKVxuICAgIGFyZzogKDEyLCAyMCwgMzUpYFwiXV1cbiAgICBidWlsdC1pbjpmb3JbXCJgQnVpbHQtSW46XG5mb3JgXCJdXG4gICAgc3R5bGUgYnVpbHQtaW46Zm9yIHN0cm9rZTpncmF5LGZpbGw6Z3JheSxzdHJva2Utd2lkdGg6MnB4LG9wYWNpdHk6Ljg7XG4gICAgMzh7e1wiYCojOTE7UlN0cmluZyM5MzsqICoqIzM0O1N1bSM1ODsjMzQ7KipcbiAgICAgICoxMS41LTEwKiAoKippZDogMzgqKilgXCJ9fVxuICAgIDQwKFtcImAqIzkxO1JTeW1ib2wjOTM7KiAqKnN1bSoqXG4gICAgICAqMTEuMTMtMTUqICgqKmlkOiA0MCoqKWBcIl0pXG4gICAgNDJ7e1wiYCojOTE7UlN0cmluZyM5MzsqICoqIzM0O1xuIzM0OyoqXG4gICAgICAqMTEuMTgtMjEqICgqKmlkOiA0MioqKWBcIn19XG4gICAgNDRbW1wiYCojOTE7UkZ1bmN0aW9uQ2FsbCM5MzsqIGJhc2UjNTg7IzU4OyoqY2F0KipcbiAgICAgICoxMS4xLTIyKiAoKippZDogNDQqKilcbiAgICBhcmc6ICgzOCwgNDAsIDQyKWBcIl1dXG4gICAgYnVpbHQtaW46Y2F0W1wiYEJ1aWx0LUluOlxuY2F0YFwiXVxuICAgIHN0eWxlIGJ1aWx0LWluOmNhdCBzdHJva2U6Z3JheSxmaWxsOmdyYXksc3Ryb2tlLXdpZHRoOjJweCxvcGFjaXR5Oi44O1xuICAgIDQ2e3tcImAqIzkxO1JTdHJpbmcjOTM7KiAqKiMzNDtQcm9kdWN0IzU4OyMzNDsqKlxuICAgICAgKjEyLjUtMTQqICgqKmlkOiA0NioqKWBcIn19XG4gICAgNDgoW1wiYCojOTE7UlN5bWJvbCM5MzsqICoqcHJvZHVjdCoqXG4gICAgICAqMTIuMTctMjMqICgqKmlkOiA0OCoqKWBcIl0pXG4gICAgNTB7e1wiYCojOTE7UlN0cmluZyM5MzsqICoqIzM0O1xuIzM0OyoqXG4gICAgICAqMTIuMjYtMjkqICgqKmlkOiA1MCoqKWBcIn19XG4gICAgNTJbW1wiYCojOTE7UkZ1bmN0aW9uQ2FsbCM5MzsqIGJhc2UjNTg7IzU4OyoqY2F0KipcbiAgICAgICoxMi4xLTMwKiAoKippZDogNTIqKilcbiAgICBhcmc6ICg0NiwgNDgsIDUwKWBcIl1dXG4gICAgMSAtLi0+fFwiZmxvd1wifCAwXG4gICAgbGlua1N0eWxlIDAgc3Ryb2tlOmdyYXksY29sb3I6Z3JheTtcbiAgICAwIC0tPnxcImRlZmluZWQtYnksIGZsb3dcInwgMlxuICAgIDAgLS0+fFwiZGVmaW5lZC1ieVwifCAxXG4gICAgMiAtLT58XCJyZWFkcywgYXJnXCJ8IDFcbiAgICAyIC0tPnxcInJldHVybnMsIGFyZ1wifCAwXG4gICAgMiAtLi0+fFwicmVhZHMsIGNhbGxzXCJ8IGJ1aWx0LWluOl82MF8tXG4gICAgbGlua1N0eWxlIDUgc3Ryb2tlOmdyYXk7XG4gICAgMiAtLi0+fFwiZmxvd1wifCA0XG4gICAgbGlua1N0eWxlIDYgc3Ryb2tlOmdyYXksY29sb3I6Z3JheTtcbiAgICA0IC0uLT58XCJmbG93XCJ8IDNcbiAgICBsaW5rU3R5bGUgNyBzdHJva2U6Z3JheSxjb2xvcjpncmF5O1xuICAgIDMgLS0+fFwiZGVmaW5lZC1ieSwgZmxvd1wifCA1XG4gICAgMyAtLT58XCJkZWZpbmVkLWJ5XCJ8IDRcbiAgICA1IC0tPnxcInJlYWRzLCBhcmdcInwgNFxuICAgIDUgLS0+fFwicmV0dXJucywgYXJnXCJ8IDNcbiAgICA1IC0uLT58XCJyZWFkcywgY2FsbHNcInwgYnVpbHQtaW46XzYwXy1cbiAgICBsaW5rU3R5bGUgMTIgc3Ryb2tlOmdyYXk7XG4gICAgNSAtLi0+fFwiZmxvd1wifCA3XG4gICAgbGlua1N0eWxlIDEzIHN0cm9rZTpncmF5LGNvbG9yOmdyYXk7XG4gICAgNyAtLi0+fFwiZmxvd1wifCA2XG4gICAgbGlua1N0eWxlIDE0IHN0cm9rZTpncmF5LGNvbG9yOmdyYXk7XG4gICAgNiAtLT58XCJkZWZpbmVkLWJ5LCBmbG93XCJ8IDhcbiAgICA2IC0tPnxcImRlZmluZWQtYnlcInwgN1xuICAgIDggLS0+fFwicmVhZHMsIGFyZ1wifCA3XG4gICAgOCAtLT58XCJyZXR1cm5zLCBhcmdcInwgNlxuICAgIDggLS4tPnxcInJlYWRzLCBjYWxsc1wifCBidWlsdC1pbjpfNjBfLVxuICAgIGxpbmtTdHlsZSAxOSBzdHJva2U6Z3JheTtcbiAgICA4IC0uLT58XCJmbG93XCJ8IDEwXG4gICAgbGlua1N0eWxlIDIwIHN0cm9rZTpncmF5LGNvbG9yOmdyYXk7XG4gICAgMTAgLS4tPnxcImZsb3dcInwgOVxuICAgIGxpbmtTdHlsZSAyMSBzdHJva2U6Z3JheSxjb2xvcjpncmF5O1xuICAgIDkgLS0+fFwiZGVmaW5lZC1ieSwgZmxvd1wifCAxMVxuICAgIDkgLS0+fFwiZGVmaW5lZC1ieVwifCAxMFxuICAgIDExIC0tPnxcInJlYWRzLCBhcmdcInwgMTBcbiAgICAxMSAtLT58XCJyZXR1cm5zLCBhcmdcInwgOVxuICAgIDExIC0uLT58XCJyZWFkcywgY2FsbHNcInwgYnVpbHQtaW46XzYwXy1cbiAgICBsaW5rU3R5bGUgMjYgc3Ryb2tlOmdyYXk7XG4gICAgMTEgLS4tPnxcImZsb3dcInwgMTNcbiAgICBsaW5rU3R5bGUgMjcgc3Ryb2tlOmdyYXksY29sb3I6Z3JheTtcbiAgICAxMiAtLT58XCJkZWZpbmVkLWJ5XCJ8IDIwXG4gICAgMTIgLS4tPnxcImJyYW5jaCAod2hlbjogdHJ1ZSlcInwgMjRcbiAgICBsaW5rU3R5bGUgMjkgc3Ryb2tlOmdyYXksY29sb3I6Z3JheTtcbiAgICAxMiAtLi0+fFwiYnJhbmNoICh3aGVuOiBmYWxzZSlcInwgMzZcbiAgICBsaW5rU3R5bGUgMzAgc3Ryb2tlOmdyYXksY29sb3I6Z3JheTtcbiAgICAxMyAtLi0+fFwiZmxvd1wifCAxNlxuICAgIGxpbmtTdHlsZSAzMSBzdHJva2U6Z3JheSxjb2xvcjpncmF5O1xuICAgIDE2IC0tPnxcInJlYWRzXCJ8IDlcbiAgICAxNiAtLi0+fFwiZmxvd1wifCAxN1xuICAgIGxpbmtTdHlsZSAzMyBzdHJva2U6Z3JheSxjb2xvcjpncmF5O1xuICAgIDE3IC0uLT58XCJmbG93XCJ8IDE4XG4gICAgbGlua1N0eWxlIDM0IHN0cm9rZTpncmF5LGNvbG9yOmdyYXk7XG4gICAgMTggLS0+fFwicmVhZHMsIGFyZ1wifCAxNlxuICAgIDE4IC0tPnxcInJlYWRzLCBhcmdcInwgMTdcbiAgICAxOCAtLi0+fFwicmVhZHMsIGNhbGxzXCJ8IGJ1aWx0LWluOi1cbiAgICBsaW5rU3R5bGUgMzcgc3Ryb2tlOmdyYXk7XG4gICAgMTggLS4tPnxcImZsb3dcInwgMTlcbiAgICBsaW5rU3R5bGUgMzggc3Ryb2tlOmdyYXksY29sb3I6Z3JheTtcbiAgICAxOSAtLT58XCJyZWFkcywgcmV0dXJucywgYXJnXCJ8IDE4XG4gICAgMTkgLS4tPnxcInJlYWRzXCJ8IGJ1aWx0LWluOl80MF9cbiAgICBsaW5rU3R5bGUgNDAgc3Ryb2tlOmdyYXk7XG4gICAgMTkgLS4tPnxcImZsb3dcInwgMjBcbiAgICBsaW5rU3R5bGUgNDEgc3Ryb2tlOmdyYXksY29sb3I6Z3JheTtcbiAgICAyMCAtLT58XCJyZWFkcywgYXJnXCJ8IDEzXG4gICAgMjAgLS0+fFwicmVhZHMsIGFyZ1wifCAxOVxuICAgIDIwIC0uLT58XCJmbG93XCJ8IDEyXG4gICAgbGlua1N0eWxlIDQ0IHN0cm9rZTpncmF5LGNvbG9yOmdyYXk7XG4gICAgMjAgLS4tPnxcInJlYWRzLCBjYWxsc1wifCBidWlsdC1pbjo6XG4gICAgbGlua1N0eWxlIDQ1IHN0cm9rZTpncmF5O1xuICAgIDI0IC0tPnxcInJlYWRzXCJ8IDBcbiAgICAyNCAtLi0+fFwiZmxvd1wifCAyNVxuICAgIGxpbmtTdHlsZSA0NyBzdHJva2U6Z3JheSxjb2xvcjpncmF5O1xuICAgIDI0IC0tPnxcInJlYWRzXCJ8IDIzXG4gICAgMjUgLS0+fFwicmVhZHNcInwgMTJcbiAgICAyNSAtLi0+fFwiZmxvd1wifCAyNlxuICAgIGxpbmtTdHlsZSA1MCBzdHJva2U6Z3JheSxjb2xvcjpncmF5O1xuICAgIDI2IC0tPnxcInJlYWRzLCBhcmdcInwgMjRcbiAgICAyNiAtLT58XCJyZWFkcywgYXJnXCJ8IDI1XG4gICAgMjYgLS4tPnxcInJlYWRzLCBjYWxsc1wifCBidWlsdC1pbjpfNDNfXG4gICAgbGlua1N0eWxlIDUzIHN0cm9rZTpncmF5O1xuICAgIDI2IC0uLT58XCJmbG93XCJ8IDI3XG4gICAgbGlua1N0eWxlIDU0IHN0cm9rZTpncmF5LGNvbG9yOmdyYXk7XG4gICAgMjcgLS0+fFwicmVhZHNcInwgNlxuICAgIDI3IC0uLT58XCJmbG93XCJ8IDI4XG4gICAgbGlua1N0eWxlIDU2IHN0cm9rZTpncmF5LGNvbG9yOmdyYXk7XG4gICAgMjggLS0+fFwicmVhZHMsIGFyZ1wifCAyNlxuICAgIDI4IC0tPnxcInJlYWRzLCBhcmdcInwgMjdcbiAgICAyOCAtLi0+fFwiZmxvd1wifCAyM1xuICAgIGxpbmtTdHlsZSA1OSBzdHJva2U6Z3JheSxjb2xvcjpncmF5O1xuICAgIDI4IC0uLT58XCJyZWFkcywgY2FsbHNcInwgYnVpbHQtaW46XzQzX1xuICAgIGxpbmtTdHlsZSA2MCBzdHJva2U6Z3JheTtcbiAgICAyMyAtLT58XCJkZWZpbmVkLWJ5LCBmbG93XCJ8IDI5XG4gICAgMjMgLS0+fFwiZGVmaW5lZC1ieVwifCAyOFxuICAgIDI5IC0tPnxcInJlYWRzLCBhcmdcInwgMjhcbiAgICAyOSAtLT58XCJyZXR1cm5zLCBhcmdcInwgMjNcbiAgICAyOSAtLi0+fFwicmVhZHMsIGNhbGxzXCJ8IGJ1aWx0LWluOl82MF8tXG4gICAgbGlua1N0eWxlIDY1IHN0cm9rZTpncmF5O1xuICAgIDI5IC0uLT58XCJmbG93XCJ8IDMxXG4gICAgbGlua1N0eWxlIDY2IHN0cm9rZTpncmF5LGNvbG9yOmdyYXk7XG4gICAgMzEgLS0+fFwicmVhZHNcInwgM1xuICAgIDMxIC0uLT58XCJmbG93XCJ8IDMyXG4gICAgbGlua1N0eWxlIDY4IHN0cm9rZTpncmF5LGNvbG9yOmdyYXk7XG4gICAgMzEgLS0+fFwicmVhZHNcInwgMzBcbiAgICAzMiAtLT58XCJyZWFkc1wifCAxMlxuICAgIDMyIC0uLT58XCJmbG93XCJ8IDMzXG4gICAgbGlua1N0eWxlIDcxIHN0cm9rZTpncmF5LGNvbG9yOmdyYXk7XG4gICAgMzMgLS0+fFwicmVhZHMsIGFyZ1wifCAzMVxuICAgIDMzIC0tPnxcInJlYWRzLCBhcmdcInwgMzJcbiAgICAzMyAtLi0+fFwiZmxvd1wifCAzMFxuICAgIGxpbmtTdHlsZSA3NCBzdHJva2U6Z3JheSxjb2xvcjpncmF5O1xuICAgIDMzIC0uLT58XCJyZWFkcywgY2FsbHNcInwgYnVpbHQtaW46XzQyX1xuICAgIGxpbmtTdHlsZSA3NSBzdHJva2U6Z3JheTtcbiAgICAzMCAtLT58XCJkZWZpbmVkLWJ5LCBmbG93XCJ8IDM0XG4gICAgMzAgLS0+fFwiZGVmaW5lZC1ieVwifCAzM1xuICAgIDM0IC0tPnxcInJlYWRzLCBhcmdcInwgMzNcbiAgICAzNCAtLT58XCJyZXR1cm5zLCBhcmdcInwgMzBcbiAgICAzNCAtLi0+fFwicmVhZHMsIGNhbGxzXCJ8IGJ1aWx0LWluOl82MF8tXG4gICAgbGlua1N0eWxlIDgwIHN0cm9rZTpncmF5O1xuICAgIDM0IC0uLT58XCJmbG93XCJ8IDM1XG4gICAgbGlua1N0eWxlIDgxIHN0cm9rZTpncmF5LGNvbG9yOmdyYXk7XG4gICAgMzUgLS0+fFwiYXJnXCJ8IDI5XG4gICAgMzUgLS0+fFwicmV0dXJucywgYXJnXCJ8IDM0XG4gICAgMzUgLS4tPnxcInJlYWRzLCBjYWxsc1wifCBidWlsdC1pbjpfMTIzX1xuICAgIGxpbmtTdHlsZSA4NCBzdHJva2U6Z3JheTtcbiAgICAzNSAtLi0+fFwiZmxvd1wifCAxMlxuICAgIGxpbmtTdHlsZSA4NSBzdHJva2U6Z3JheSxjb2xvcjpncmF5O1xuICAgIDM2IC0tPnxcImFyZ1wifCAxMlxuICAgIDM2IC0tPnxcInJlYWRzLCBhcmdcInwgMjBcbiAgICAzNiAtLT58XCJhcmcsIG5vbi1zdGFuZGFyZC1ldmFsdWF0aW9uXCJ8IDM1XG4gICAgMzYgLS4tPnxcInJlYWRzLCBjYWxsc1wifCBidWlsdC1pbjpmb3JcbiAgICBsaW5rU3R5bGUgODkgc3Ryb2tlOmdyYXk7XG4gICAgMzYgLS4tPnxcImZsb3dcInwgMzhcbiAgICBsaW5rU3R5bGUgOTAgc3Ryb2tlOmdyYXksY29sb3I6Z3JheTtcbiAgICAzOCAtLi0+fFwiZmxvd1wifCA0MFxuICAgIGxpbmtTdHlsZSA5MSBzdHJva2U6Z3JheSxjb2xvcjpncmF5O1xuICAgIDQwIC0tPnxcInJlYWRzXCJ8IDIzXG4gICAgNDAgLS4tPnxcImZsb3dcInwgNDJcbiAgICBsaW5rU3R5bGUgOTMgc3Ryb2tlOmdyYXksY29sb3I6Z3JheTtcbiAgICA0MiAtLi0+fFwiZmxvd1wifCA0NFxuICAgIGxpbmtTdHlsZSA5NCBzdHJva2U6Z3JheSxjb2xvcjpncmF5O1xuICAgIDQ0IC0tPnxcInJlYWRzLCBhcmdcInwgMzhcbiAgICA0NCAtLT58XCJyZWFkcywgYXJnXCJ8IDQwXG4gICAgNDQgLS0+fFwicmVhZHMsIGFyZ1wifCA0MlxuICAgIDQ0IC0uLT58XCJyZWFkcywgY2FsbHNcInwgYnVpbHQtaW46Y2F0XG4gICAgbGlua1N0eWxlIDk4IHN0cm9rZTpncmF5O1xuICAgIDQ0IC0uLT58XCJmbG93XCJ8IDQ2XG4gICAgbGlua1N0eWxlIDk5IHN0cm9rZTpncmF5LGNvbG9yOmdyYXk7XG4gICAgNDYgLS4tPnxcImZsb3dcInwgNDhcbiAgICBsaW5rU3R5bGUgMTAwIHN0cm9rZTpncmF5LGNvbG9yOmdyYXk7XG4gICAgNDggLS0+fFwicmVhZHNcInwgMzBcbiAgICA0OCAtLi0+fFwiZmxvd1wifCA1MFxuICAgIGxpbmtTdHlsZSAxMDIgc3Ryb2tlOmdyYXksY29sb3I6Z3JheTtcbiAgICA1MCAtLi0+fFwiZmxvd1wifCA1MlxuICAgIGxpbmtTdHlsZSAxMDMgc3Ryb2tlOmdyYXksY29sb3I6Z3JheTtcbiAgICA1MiAtLT58XCJyZWFkcywgYXJnXCJ8IDQ2XG4gICAgNTIgLS0+fFwicmVhZHMsIGFyZ1wifCA0OFxuICAgIDUyIC0tPnxcInJlYWRzLCBhcmdcInwgNTBcbiAgICA1MiAtLi0+fFwicmVhZHMsIGNhbGxzXCJ8IGJ1aWx0LWluOmNhdFxuICAgIGxpbmtTdHlsZSAxMDcgc3Ryb2tlOmdyYXk7IiwibWVybWFpZCI6eyJhdXRvU3luYyI6dHJ1ZX19
    

    链接输出后应显示以下内容:

    flowchart LR
        1{{"`*#91;RNumber#93;* **0**
          *1.8* (**id: 1**)`"}}
        0["`*#91;RSymbol#93;* **sum**
          *1.1-3* (**id: 0**, v: 1)`"]
        2[["`*#91;RBinaryOp#93;* base#58;#58;**#60;#45;**
          *1.1-8* (**id: 2**)
        arg: (0, 1)`"]]
        built-in:_60_-["`Built-In:
    #60;#45;`"]
        style built-in:_60_- stroke:gray,fill:gray,stroke-width:2px,opacity:.8;
        4{{"`*#91;RNumber#93;* **1**
          *2.12* (**id: 4**)`"}}
        3["`*#91;RSymbol#93;* **product**
          *2.1-7* (**id: 3**, v: 4)`"]
        5[["`*#91;RBinaryOp#93;* base#58;#58;**#60;#45;**
          *2.1-12* (**id: 5**)
        arg: (3, 4)`"]]
        7{{"`*#91;RNumber#93;* **7**
          *3.6* (**id: 7**)`"}}
        6["`*#91;RSymbol#93;* **w**
          *3.1* (**id: 6**, v: 7)`"]
        8[["`*#91;RBinaryOp#93;* base#58;#58;**#60;#45;**
          *3.1-6* (**id: 8**)
        arg: (6, 7)`"]]
        10{{"`*#91;RNumber#93;* **10**
          *4.6-7* (**id: 10**)`"}}
        9["`*#91;RSymbol#93;* **N**
          *4.1* (**id: 9**, v: 10)`"]
        11[["`*#91;RBinaryOp#93;* base#58;#58;**#60;#45;**
          *4.1-7* (**id: 11**)
        arg: (9, 10)`"]]
        12["`*#91;RSymbol#93;* **i**
          *6.6* (**id: 12**, v: 20)`"]
        13{{"`*#91;RNumber#93;* **1**
          *6.11* (**id: 13**)`"}}
        16(["`*#91;RSymbol#93;* **N**
          *6.14* (**id: 16**)`"])
        17{{"`*#91;RNumber#93;* **1**
          *6.16* (**id: 17**)`"}}
        18[["`*#91;RBinaryOp#93;* base#58;#58;**#45;**
          *6.14-16* (**id: 18**)
        arg: (16, 17)`"]]
        built-in:-["`Built-In:
    #45;`"]
        style built-in:- stroke:gray,fill:gray,stroke-width:2px,opacity:.8;
        19[["`*#91;RExpressionList#93;* base#58;#58;**(**
          *6.13* (**id: 19**)
        arg: (18)`"]]
        built-in:_40_["`Built-In:
    (`"]
        style built-in:_40_ stroke:gray,fill:gray,stroke-width:2px,opacity:.8;
        20[["`*#91;RBinaryOp#93;* base#58;#58;**#58;**
          *6.11-17* (**id: 20**)
        arg: (13, 19)`"]]
        built-in::["`Built-In:
    #58;`"]
        style built-in:: stroke:gray,fill:gray,stroke-width:2px,opacity:.8;
        24(["`*#91;RSymbol#93;* **sum**
          *7.10-12* (**id: 24**, 36+)`"])
        25(["`*#91;RSymbol#93;* **i**
          *7.16* (**id: 25**, 36+)`"])
        26[["`*#91;RBinaryOp#93;* base#58;#58;**#43;**
          *7.10-16* (**id: 26**, 36+)
        arg: (24, 25)`"]]
        built-in:_43_["`Built-In:
    #43;`"]
        style built-in:_43_ stroke:gray,fill:gray,stroke-width:2px,opacity:.8;
        27(["`*#91;RSymbol#93;* **w**
          *7.20* (**id: 27**, 36+)`"])
        28[["`*#91;RBinaryOp#93;* base#58;#58;**#43;**
          *7.10-20* (**id: 28**, 36+)
        arg: (26, 27)`"]]
        23["`*#91;RSymbol#93;* **sum**
          *7.3-5* (**id: 23**, 36+, v: 28)`"]
        29[["`*#91;RBinaryOp#93;* base#58;#58;**#60;#45;**
          *7.3-20* (**id: 29**, 36+)
        arg: (23, 28)`"]]
        31(["`*#91;RSymbol#93;* **product**
          *8.14-20* (**id: 31**, 36+)`"])
        32(["`*#91;RSymbol#93;* **i**
          *8.24* (**id: 32**, 36+)`"])
        33[["`*#91;RBinaryOp#93;* base#58;#58;**#42;**
          *8.14-24* (**id: 33**, 36+)
        arg: (31, 32)`"]]
        built-in:_42_["`Built-In:
    #42;`"]
        style built-in:_42_ stroke:gray,fill:gray,stroke-width:2px,opacity:.8;
        30["`*#91;RSymbol#93;* **product**
          *8.3-9* (**id: 30**, 36+, v: 33)`"]
        34[["`*#91;RBinaryOp#93;* base#58;#58;**#60;#45;**
          *8.3-24* (**id: 34**, 36+)
        arg: (30, 33)`"]]
        35[["`*#91;RExpressionList#93;* base#58;#58;**#123;**
          *6.20* (**id: 35**, 36+)
        arg: (29, 34)`"]]
        built-in:_123_["`Built-In:
    #123;`"]
        style built-in:_123_ stroke:gray,fill:gray,stroke-width:2px,opacity:.8;
        36[["`*#91;RForLoop#93;* base#58;#58;**for**
          *6.1-9.1* (**id: 36**)
        arg: (12, 20, 35)`"]]
        built-in:for["`Built-In:
    for`"]
        style built-in:for stroke:gray,fill:gray,stroke-width:2px,opacity:.8;
        38{{"`*#91;RString#93;* **#34;Sum#58;#34;**
          *11.5-10* (**id: 38**)`"}}
        40(["`*#91;RSymbol#93;* **sum**
          *11.13-15* (**id: 40**)`"])
        42{{"`*#91;RString#93;* **#34;
    #34;**
          *11.18-21* (**id: 42**)`"}}
        44[["`*#91;RFunctionCall#93;* base#58;#58;**cat**
          *11.1-22* (**id: 44**)
        arg: (38, 40, 42)`"]]
        built-in:cat["`Built-In:
    cat`"]
        style built-in:cat stroke:gray,fill:gray,stroke-width:2px,opacity:.8;
        46{{"`*#91;RString#93;* **#34;Product#58;#34;**
          *12.5-14* (**id: 46**)`"}}
        48(["`*#91;RSymbol#93;* **product**
          *12.17-23* (**id: 48**)`"])
        50{{"`*#91;RString#93;* **#34;
    #34;**
          *12.26-29* (**id: 50**)`"}}
        52[["`*#91;RFunctionCall#93;* base#58;#58;**cat**
          *12.1-30* (**id: 52**)
        arg: (46, 48, 50)`"]]
        1 -.->|"flow"| 0
        linkStyle 0 stroke:gray,color:gray;
        0 -->|"defined-by, flow"| 2
        0 -->|"defined-by"| 1
        2 -->|"reads, arg"| 1
        2 -->|"returns, arg"| 0
        2 -.->|"reads, calls"| built-in:_60_-
        linkStyle 5 stroke:gray;
        2 -.->|"flow"| 4
        linkStyle 6 stroke:gray,color:gray;
        4 -.->|"flow"| 3
        linkStyle 7 stroke:gray,color:gray;
        3 -->|"defined-by, flow"| 5
        3 -->|"defined-by"| 4
        5 -->|"reads, arg"| 4
        5 -->|"returns, arg"| 3
        5 -.->|"reads, calls"| built-in:_60_-
        linkStyle 12 stroke:gray;
        5 -.->|"flow"| 7
        linkStyle 13 stroke:gray,color:gray;
        7 -.->|"flow"| 6
        linkStyle 14 stroke:gray,color:gray;
        6 -->|"defined-by, flow"| 8
        6 -->|"defined-by"| 7
        8 -->|"reads, arg"| 7
        8 -->|"returns, arg"| 6
        8 -.->|"reads, calls"| built-in:_60_-
        linkStyle 19 stroke:gray;
        8 -.->|"flow"| 10
        linkStyle 20 stroke:gray,color:gray;
        10 -.->|"flow"| 9
        linkStyle 21 stroke:gray,color:gray;
        9 -->|"defined-by, flow"| 11
        9 -->|"defined-by"| 10
        11 -->|"reads, arg"| 10
        11 -->|"returns, arg"| 9
        11 -.->|"reads, calls"| built-in:_60_-
        linkStyle 26 stroke:gray;
        11 -.->|"flow"| 13
        linkStyle 27 stroke:gray,color:gray;
        12 -->|"defined-by"| 20
        12 -.->|"branch (when: true)"| 24
        linkStyle 29 stroke:gray,color:gray;
        12 -.->|"branch (when: false)"| 36
        linkStyle 30 stroke:gray,color:gray;
        13 -.->|"flow"| 16
        linkStyle 31 stroke:gray,color:gray;
        16 -->|"reads"| 9
        16 -.->|"flow"| 17
        linkStyle 33 stroke:gray,color:gray;
        17 -.->|"flow"| 18
        linkStyle 34 stroke:gray,color:gray;
        18 -->|"reads, arg"| 16
        18 -->|"reads, arg"| 17
        18 -.->|"reads, calls"| built-in:-
        linkStyle 37 stroke:gray;
        18 -.->|"flow"| 19
        linkStyle 38 stroke:gray,color:gray;
        19 -->|"reads, returns, arg"| 18
        19 -.->|"reads"| built-in:_40_
        linkStyle 40 stroke:gray;
        19 -.->|"flow"| 20
        linkStyle 41 stroke:gray,color:gray;
        20 -->|"reads, arg"| 13
        20 -->|"reads, arg"| 19
        20 -.->|"flow"| 12
        linkStyle 44 stroke:gray,color:gray;
        20 -.->|"reads, calls"| built-in::
        linkStyle 45 stroke:gray;
        24 -->|"reads"| 0
        24 -.->|"flow"| 25
        linkStyle 47 stroke:gray,color:gray;
        24 -->|"reads"| 23
        25 -->|"reads"| 12
        25 -.->|"flow"| 26
        linkStyle 50 stroke:gray,color:gray;
        26 -->|"reads, arg"| 24
        26 -->|"reads, arg"| 25
        26 -.->|"reads, calls"| built-in:_43_
        linkStyle 53 stroke:gray;
        26 -.->|"flow"| 27
        linkStyle 54 stroke:gray,color:gray;
        27 -->|"reads"| 6
        27 -.->|"flow"| 28
        linkStyle 56 stroke:gray,color:gray;
        28 -->|"reads, arg"| 26
        28 -->|"reads, arg"| 27
        28 -.->|"flow"| 23
        linkStyle 59 stroke:gray,color:gray;
        28 -.->|"reads, calls"| built-in:_43_
        linkStyle 60 stroke:gray;
        23 -->|"defined-by, flow"| 29
        23 -->|"defined-by"| 28
        29 -->|"reads, arg"| 28
        29 -->|"returns, arg"| 23
        29 -.->|"reads, calls"| built-in:_60_-
        linkStyle 65 stroke:gray;
        29 -.->|"flow"| 31
        linkStyle 66 stroke:gray,color:gray;
        31 -->|"reads"| 3
        31 -.->|"flow"| 32
        linkStyle 68 stroke:gray,color:gray;
        31 -->|"reads"| 30
        32 -->|"reads"| 12
        32 -.->|"flow"| 33
        linkStyle 71 stroke:gray,color:gray;
        33 -->|"reads, arg"| 31
        33 -->|"reads, arg"| 32
        33 -.->|"flow"| 30
        linkStyle 74 stroke:gray,color:gray;
        33 -.->|"reads, calls"| built-in:_42_
        linkStyle 75 stroke:gray;
        30 -->|"defined-by, flow"| 34
        30 -->|"defined-by"| 33
        34 -->|"reads, arg"| 33
        34 -->|"returns, arg"| 30
        34 -.->|"reads, calls"| built-in:_60_-
        linkStyle 80 stroke:gray;
        34 -.->|"flow"| 35
        linkStyle 81 stroke:gray,color:gray;
        35 -->|"arg"| 29
        35 -->|"returns, arg"| 34
        35 -.->|"reads, calls"| built-in:_123_
        linkStyle 84 stroke:gray;
        35 -.->|"flow"| 12
        linkStyle 85 stroke:gray,color:gray;
        36 -->|"arg"| 12
        36 -->|"reads, arg"| 20
        36 -->|"arg, non-standard-evaluation"| 35
        36 -.->|"reads, calls"| built-in:for
        linkStyle 89 stroke:gray;
        36 -.->|"flow"| 38
        linkStyle 90 stroke:gray,color:gray;
        38 -.->|"flow"| 40
        linkStyle 91 stroke:gray,color:gray;
        40 -->|"reads"| 23
        40 -.->|"flow"| 42
        linkStyle 93 stroke:gray,color:gray;
        42 -.->|"flow"| 44
        linkStyle 94 stroke:gray,color:gray;
        44 -->|"reads, arg"| 38
        44 -->|"reads, arg"| 40
        44 -->|"reads, arg"| 42
        44 -.->|"reads, calls"| built-in:cat
        linkStyle 98 stroke:gray;
        44 -.->|"flow"| 46
        linkStyle 99 stroke:gray,color:gray;
        46 -.->|"flow"| 48
        linkStyle 100 stroke:gray,color:gray;
        48 -->|"reads"| 30
        48 -.->|"flow"| 50
        linkStyle 102 stroke:gray,color:gray;
        50 -.->|"flow"| 52
        linkStyle 103 stroke:gray,color:gray;
        52 -->|"reads, arg"| 46
        52 -->|"reads, arg"| 48
        52 -->|"reads, arg"| 50
        52 -.->|"reads, calls"| built-in:cat
        linkStyle 107 stroke:gray;
    
(The analysis ran (parse and normalize with the [tree-sitter](https://github.com/flowr-analysis/flowr/wiki/Engines) engine) in the generation environment. No [signature database](https://github.com/flowr-analysis/flowr/wiki/Signature-Database) is mounted, so `library()` attaches no exports (base-R names are still qualified, e.g., `stats::acf`).)

</details>

</details>

如果你想使用流程R及其提供的特性,请随意检查:

如果您已经使用流程R并想要反馈, 请考虑填写我们 反馈表单。 。 。 .

开始

要开始 流量R 及其特征,请检查 概览 维基页面. 这个 设置 维基页面解释如何下载和设置 流量R 在你的系统. 使用 docker QQ,以下一行应该足够(并直接将您放入读取-eval-print回路) :

docker run -it --rm eagleoutice/flowr

您可以进入 :help 获取更多有关其能力的信息.

实例 REPL 会话

Example of a simple REPL session

如果您想要使用相同的命令 :

  1. 开始运行 docker run -it --rm eagleoutice/flowr 在终端中启动 REPL.
  2. 在REPL中,它运行 :slicer -c '11@prod' demo.R --diff 切换示例文件 demo.R 用于第11行中的打印语句. 请注意: 11 指第11行号切入!

更多信息

关于如何使用的详细信息 流量R 请参考 维基页面, (中文(简体) ), 以及部署人员 代码文档。 。 。 . 请查看以下出版物。 具体指源代码, 请检查出流R's Zenodo 存档。 。 。 .

* 关于流程R的出版物

如果你对理论背景感兴趣的话 流量R, (中文(简体) ), 请检查date=中的日期值 (帮助) 以下出版物(如果发现这里缺少一纸,请打开) 有新问题:

  • 支持数据分析脚本综合(FSE ' 25,工具)
    这是指对框架的最新工具演示. 预印时间 arXiv:2604.15963 (中文(简体) )。 。 。 .

    BibTeX 函数
    @article{10.1145/3803437.3806402,
     author = {Sihler, Florian and Gerstl, Oliver and Pfrenger, Lars and Schubert, Julian and Tichy, Matthias},
     title = {Supporting the Comprehension of Data Analysis Scripts},
     year = {2026},
     doi = {10.1145/3803437.3806402}
    }
    
  • 静态分析 R 程序的数据流(OPSLA ' 25)
    如果您在研究中使用了流程R, 请引用本文 .

    BibTeX 函数
    @article{10.1145/3763087,
     author = {Sihler, Florian and Tichy, Matthias},
     title = {Statically Analyzing the Dataflow of R Programs},
     year = {2025},
     issue_date = {October 2025},
     publisher = {Association for Computing Machinery},
     address = {New York, NY, USA},
     volume = {9},
     number = {OOPSLA2},
     url = {https://doi.org/10.1145/3763087},
     doi = {10.1145/3763087},
     abstract = {The R programming language is primarily designed for statistical computing and mostly used by researchers without a background in computer science. R provides a wide range of dynamic features and peculiarities that are difficult to analyze statically like dynamic scoping and lazy evaluation with dynamic side effects. At the same time, the R ecosystem lacks sophisticated analysis tools that support researchers in understanding and improving their code.   In this paper, we present a novel static dataflow analysis framework for the R programming language that is capable of handling the dynamic nature of R programs and produces the dataflow graph of given R programs. This graph can be essential in a range of analyses, including program slicing, which we implement as a proof of concept. The core analysis works as a stateful fold over a normalized version of the abstract syntax tree of the R program, which tracks (re-)definitions, values, function calls, side effects, external files, and a dynamic control flow to produce one dataflow graph per program.   We evaluate the correctness of our analysis using output equivalence testing on a manually curated dataset of 779 sensible slicing points from executable real-world R scripts. Additionally, we use a set of systematic test cases based on the capabilities of the R language and the implementation of the R interpreter and measure the runtimes well as the memory consumption on a set of 4,230 real-world R scripts and 20,815 packages available on R’s package manager CRAN.   Furthermore, we evaluate the recall of our program slicer, its accuracy using shrinking, and its improvement over the state of the art. We correctly analyze almost all programs in our equivalence test suite, preserving the identical output for 99.7\% of the manually curated slicing points. On average, we require 576ms to analyze the dataflow and around 213kB to store the graph of a research script.   This shows that our analysis is capable of analyzing real-world sources quickly and correctly. Our slicer achieves an average reduction of 84.8\% of tokens indicating its potential to improve program comprehension.},
     journal = {Proc. ACM Program. Lang.},
     month = oct,
     articleno = {309},
     numpages = {29},
     keywords = {Dataflow Analysis, R Programming Language, Static Analysis}
    }
    
  • flowR: R 的静态程序扫描器( ASE' 24, 工具)
    这指的是工具演示 VS 代码扩展。 。 。 .

    BibTeX 函数
    @inproceedings{DBLP:conf/kbse/SihlerT24,
      author       = {Florian Sihler and
                      Matthias Tichy},
      editor       = {Vladimir Filkov and
                      Baishakhi Ray and
                      Minghui Zhou},
      title        = {flowR: {A} Static Program Slicer for {R}},
      booktitle    = {Proceedings of the 39th {IEEE/ACM} International Conference on Automated
                      Software Engineering, {ASE} 2024, Sacramento, CA, USA, October 27
                      - November 1, 2024},
      pages        = {2390--2393},
      publisher    = {{ACM}},
      year         = {2024},
      url          = {https://doi.org/10.1145/3691620.3695359},
      doi          = {10.1145/3691620.3695359},
      timestamp    = {Mon, 03 Mar 2025 21:16:51 +0100},
      biburl       = {https://dblp.org/rec/conf/kbse/SihlerT24.bib},
      bibsource    = {dblp computer science bibliography, https://dblp.org}
    }
    
  • 关于真实世界静态分析的解剖学(MSR ' 24)
    本文通过分析现实世界R码的特性为流程R打下基础.

    BibTeX 函数
    
    
    @inproceedings{DBLP:conf/msr/SihlerPSTDD24,
      author       = {Florian Sihler and
                      Lukas Pietzschmann and
                      Raphael Straub and
                      Matthias Tichy and
                      Andor Diera and
                      Abdelhalim Hafedh Dahou},
      editor       = {Diomidis Spinellis and
                      Alberto Bacchelli and
                      Eleni Constantinou},
      title        = {On the Anatomy of Real-World {R} Code for Static Analysis},
      booktitle    = {21st {IEEE/ACM} International Conference on Mining Software Repositories,
                      {MSR} 2024, Lisbon, Portugal, April 15-16, 2024},
      pages        = {619--630},
      publisher    = {{ACM}},
      year         = {2024},
      url          = {https://doi.org/10.1145/3643991.3644911},
      doi          = {10.1145/3643991.3644911},
      timestamp    = {Sun, 19 Jan 2025 13:31:27 +0100},
      biburl       = {https://dblp.org/rec/conf/msr/SihlerPSTDD24.bib},
      bibsource    = {dblp computer science bibliography, https://dblp.org}
    }
    

使用流程R的工程包括: OSF R 代码补编的计算可复制性 财务报告和审定财务报表 多视图结构图摘要。 。 。 .

捐款

我们欢迎所有的贡献! 这个 正在登入的开发者 页面有你需要开始的一切. 与 区域 财务报告和审定财务报表 节点.js 已安装, npm run setup:dev 检查您的前提条件,安装依赖,并配置 git 钩子. 这个 提供指南 解释我们的承诺公约, 财务报告和审定财务报表 定点测试 显示如何运行测试.

贡献者

flowR Contributors

流动器 正在积极开发 弗洛里安·西勒 和(自2025年10月1日起) 奥利弗·格斯特尔 下划线 GPLv3 许可证。 。 。 .
它由德国研究基金会(DFG)提供部分资助 504226141 (英语) ("法典通览" 并收到了来自 机会,开源数据科学公司.


生成通知

请注意此文件是使用文件自动生成的 医生读我.ts 作为源.
如果您想做出更改, 请编辑源文件( CI 将照顾其余的) . 实际上,很多文件在 维基百科 生成,所以如果想要更改,请检查源文件.

版本与发布记录

@eagleoutice/flowr 共发布 180 个版本,首次发布于 2024/01/04;过去 12 个月发布了 101 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
2.17.6latest2026/11/13今天
2.17.52026/11/094 天前
2.17.42026/11/076 天前
2.17.32026/11/067 天前
2.17.22026/11/058 天前
2.17.12026/11/049 天前

关于 @eagleoutice/flowr 的常见问题

@eagleoutice/flowr 是什么?

R 编程语言的静态数据流分析器和程序扫描器

如何安装 @eagleoutice/flowr?

在项目目录运行 npm install @eagleoutice/flowr,或使用 pnpm add / yarn add / bun add。

@eagleoutice/flowr 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@eagleoutice/flowr 支持 ESM 还是 CommonJS?

以 CommonJS 形式发布,可以直接 require();在 ES Module 项目中也可以用 import 引入(Node.js 会把 module.exports 作为默认导出)。

@eagleoutice/flowr 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=22。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@eagleoutice/flowr 可以商用吗?

@eagleoutice/flowr 使用 ISC 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@eagleoutice/flowr 的下载量有多少?

根据 npm 官方下载统计,@eagleoutice/flowr 在 2026/10/13 – 2026/11/11 这 30 天内被下载 9,409 次,日均约 314 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@eagleoutice/flowr 还在维护吗?

最新版本 2.17.6 发布于 2026/11/13(今天);至今共发布 180 个版本,其中过去 12 个月发布了 101 个;首次发布于 2024/01/04。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。