如何在 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
数据框中的命名列时,它将在最右边(并且在视图之外)我的用例)。
我现在要把头泡在冰桶里,试着忘掉元编程。
假设我有一个表,其中存储了 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
数据框中的命名列时,它将在最右边(并且在视图之外)我的用例)。
我现在要把头泡在冰桶里,试着忘掉元编程。