2015-01-01 55 views
0

說我有已存儲的一些事情R對話期間所發生的表:如何在gtable中存儲包含表達式的表格?

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") 

上面的代碼實際上是將打印 「噓」,(同時使串"x(5)"單獨的),這是不好的。

我打算使用便捷quote()作爲與print(boo)上面完成的,但如果有涉及創建,也可以被解釋解析消毒R代碼裏面串一個解決方法,我很高興地使用插入代碼代替。我還沒有找到它。

+0

使用來自未命名軟件包的函數發佈代碼是最不禮貌的,並且至少將您的受衆限制爲此類軟件包的當前用戶或願意追捕他們的用戶。 –

+0

哎呀,你的意思是'library()'行嗎?添加。 –

+1

在'gWidgets2'中,代碼列呈現爲一個字符串。但是,'gtable'方法默認顯示所有列。一個可能的解決方法(未經測試)是將列寬設置爲0.對於特定的工具包,可以製作隱藏列的命令。你正在使用哪個工具包? (順便說一下,使用'gWidgets2'是值得的 - 有一些API更改,雖然很小,但我更容易修復並推出這些更改。 – jverzani

回答

1

這是一個相當強大的解決方案,至少解決了放置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將解釋爲字符向量分隔符,因此我們用換行符摺疊結果,這是調用結果deparse()格式化的明顯原意。

作爲組裝機中,code元件最後放置在列表中,確保當在gtable數據幀變換爲指定的列,這將是最右邊的(和在視野中我的使用情況)。


我打算把我的腦袋浸在一個冰桶裏,試着忘記元編程。

相關問題