在 DiagrammeR 中将参数从函数传递到 GrViz 时出错:"Object not found"

Error passing an argument from a function to GrViz in DiagrammeR: "Object not found"

我正在尝试创建一个函数,该函数根据使用 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")

Returns 这个错误:

Error in eval(parse(text = split_references[i])): object "text_to_show" not found```.

如果我在函数外的全局环境中定义变量 text_to_show,它可以完美无误地运行:

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

#success

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

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

解决方案可能是使用 <<-:

text_to_show <<- insert_text_here

我得到一个包含两个框的图表,第一个框标记为“你好”:

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

编辑:我不知道使用 assign 是否更好或更清楚,但我发现你可以对 foo 的环境进行分配,所以这也成功了foo 主体的第一行:

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

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