如何在 gtable 中存储包含表达式的表?

How can I store a table containing expressions in gtable?

假设我有一个表,其中存储了 R 会话期间发生的一些事情:

steplist.table <- structure(list(auto.sum = structure(list(step1 = "summary1", 
    step2 = "summary2"), .Names = c("step1", "step2")), code = structure(list(
    step1 = "x(5)", step2 = print("boo")), .Names = c("step1", 
"step2")), enabled = structure(list(step1 = TRUE, step2 = TRUE), .Names = c("step1", 
"step2"))), .Names = c("auto.sum", "code", "enabled"), row.names = c("step1", 
"step2"), class = "data.frame")

或:

      auto.sum         code enabled
step1 summary1         x(5)    TRUE
step2 summary2 print("boo")    TRUE

我想将它放在 gtable() 中,然后从视图中隐藏 code 列。 code 列需要出现,因为用户将在 GUI 中对表进行一些更改。看起来 gtable() 计算了 code 列中的表达式,但它肯定没有正确显示。

示例:

library(gWidgets)
mygw <- gwindow()
gtable(steplist.table, container = mygw, filter.column = "code")

上面的代码实际上会打印 "boo",(同时保留字符串 "x(5)"),这是不好的。

我计划使用方便的 quote() 插入代码,就像上面使用 print(boo) 所做的那样,但是如果有一个解决方法涉及创建也可以由口译员,我很乐意用它来代替。我还没找到。

这是一个相当稳健的解决方案,它至少解决了将 code 放在字符串中的问题,使其在赋值过程中免受可能的评估:

new.step <- list(summary = step.summary,
                 enabled = FALSE,
                 code = paste(deparse(
                                bquote(do.call(.(func.name), .(step.args))),
                                # ensure we get knittable code
                                control = c("showAttributes" = NULL)),
                              collapse = "\n")
                        )

这里发生了一些事情:

  • 为了使代码对以后的任何事情都有用,需要取消引用的参数可以在 bquote().
  • 中使用 .() 在更大的引用表达式中进行评估
  • deparse() 会将生成的 call 对象转换为字符串,但它通常包含一堆类似元数据的内容,将元素包装在 structure() 调用中。这会混淆 knitr,因此我们将其与 "showAttributes" = NULL 一起删除,这会将其从 deparse 的此调用的选项列表中删除。
  • 最后,生成的表达式带有换行符,parse 将其解释为字符向量定界符,因此我们用换行符折叠结果,这是格式化结果 [=14= 的明显初衷] 打电话。

作为一个拼凑,code 元素放在列表的最后,确保在转换为 gtable 数据框中的命名列时,它将在最右边(并且在视图之外)我的用例)。


我现在要把头泡在冰桶里,试着忘掉元编程。