【问题标题】:Error passing an argument from a function to GrViz in DiagrammeR: "Object not found"在 DiagrammeR 中将参数从函数传递到 GrViz 时出错:“找不到对象”
【发布时间】:2021-02-24 23:34:54
【问题描述】:

我正在尝试使用diagrammeR::grViz 创建一个基于输入输出图形的函数,但grViz 函数不能替换我函数中的参数。这是一个基本示例:

library(DiagrammeR)

foo <- function(insert_text_here){
  text_to_show <- insert_text_here
  DiagrammeR::grViz("digraph {
    graph [layout = dot, rankdir = LR]

    node [shape = rectangle, fixedsize = true, width = 4.5, height = 1.5, fontname =   Helvetica, fontsize  = 20]
    rec1 [label = @@1]
    rec2 [label = b]
    # edge definitions with the node IDs
    rec1 -> rec2
    # from code

  }

  [1]: text_to_show
  ")
}

foo(insert_text_here = "hello")

返回此错误:

eval(parse(text = split_references[i])) 中的错误:找不到对象“text_to_show”```。

如果我在函数外部的全局环境中定义变量text_to_show,它可以完美运行而不会出错:

text_to_show <- "hello"
foo(insert_text_here = "hello")

#success

因此,当 GrViz 的输入由函数的参数定义时,问题就出现了。有没有办法解决这个问题?

(这似乎与这个问题有关:https://github.com/rich-iannone/DiagrammeR/issues/266

【问题讨论】:

  • 您可能还想包括一个调用代码示例以及对所有需要的包的库调用。看起来grViz 调用中的text_to_show 参数没有访问函数的环境。当我创建一个不接受参数的函数时,我得到了同样的错误,所以你也应该包括成功的方法,因为我显然不明白你对“在我的本地环境中定义变量text_to_show”的描述,
  • @IRTFM 谢谢!查看修改。
  • &lt;-= 在参数传递的上下文中是不同的。有点自相矛盾的是,&lt;- 返回的结果只是 RHS 值。

标签: r vis.js diagrammer


【解决方案1】:

解决方案可能是使用&lt;&lt;-:

text_to_show <<- insert_text_here

我得到一个带有两个框的图表,第一个框标有“你好”:

一般&lt;&lt;- 功能已被弃用,但我首先尝试将assign 进入grViz 环境并被告知其“环境已锁定”。使用&lt;&lt;- 相当于在函数定义之前进行赋值。

编辑:我不知道使用assign是否更清楚更好,但我发现你可以将foo的环境赋值,所以这也成功作为正文的第一行富的:

assign('text_to_show',  insert_text_here, envir=environment(foo))

我担心该操作中可能存在“过于递归”的内容,但似乎在评估该行时,搜索路径中有一个非常好的foo

【讨论】:

    猜你喜欢
    • 2018-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多