2014-11-09 20 views
0

我正在學習使用sparkTable包。我創建的表格有一個sparkline,後面跟着一定數量的列(不固定)。所有列都實現相同的功能:顯示時間序列的第n個元素,取整爲2位數。例如,火花圖形之後的第1列將顯示第1個時間點,第2個列,第2個數據點的值等。現在,我通過以下方式處理它:在R中,即時編寫函數(用於sparkTable內容)

首先聲明一個函數列表,允許我可能會在數據中出現多少個時間點。

get.values <- list(function(x) round(x[1],2), 
        function(x) round(x[2],2), 
        function(x) round(x[3],2), 
        function(x) round(x[4],2), 
        function(x) round(x[5],2), 
        function(x) round(x[6],2), 
        function(x) round(x[7],2), 
        function(x) round(x[8],2), 
        function(x) round(x[9],2), 
        function(x) round(x[10],2)) 

然後調用newSparkTable的時候,我讓tableContent參數「擴大」到時間點數據中存在的數量:

st <- newSparkTable(my.data, tableContent = c(list(newSparkLine()), 
               get.values[1:max(my.data$time)]), 
        ...) 

這個效果很好,但我想一定有是一個更靈活的方法(我想Python中的lambda函數,或類似的東西)。想法最受歡迎。

編輯

我越來越接近它。辦法把這個代碼評估會做的伎倆:

paste("function(x) round(x[", 1:max(my.data$time), "],2)", sep="") 

# For instance if max(my.data$time)==10 
> paste("function(x) round(x[", 1:10, "],2)", sep="") 
[1] "function(x) round(x[1],2)" "function(x) round(x[2],2)" "function(x) round(x[3],2)" 
[4] "function(x) round(x[4],2)" "function(x) round(x[5],2)" "function(x) round(x[6],2)" 
[7] "function(x) round(x[7],2)" "function(x) round(x[8],2)" "function(x) round(x[9],2)" 
[10] "function(x) round(x[10],2)" 

但後來:

> eval(parse(text=paste("function(x) round(x[", 1:10, "],2)", sep=""))) 
function(x) round(x[10],2) 

,只有最後一個被eval'd。 :■

+0

在R中用'function'創建一個匿名函數相當於Python中的'lambda'。你想要達到什麼樣的靈活性?您可以在循環或應用函數中創建這些匿名函數。 – 2014-11-09 06:41:03

+0

我添加了一個簡短的例子,我正在試圖獲取。 – 2014-11-09 07:03:32

+0

以字符串形式創建函數並對其進行評估看起來不像R。你想達到什麼目的?如果我們知道最終目標是什麼,也許我們可以從不同的角度闡明一些看法。 – 2014-11-09 08:10:48

回答

1

使用lapply用工廠函數來創建函數列表:

round.factory = function(index) { 
    j = index 
    function(x) round(x[j], 2) 
} 

get.values = lapply(1:10, round.factory) 

中間變量j必要到的index值綁定到局部範圍。

+1

你可以用'force(index)'代替 – baptiste 2014-11-09 11:42:46

+0

感謝Nick和baptiste,你幫我學了點新東西! – 2014-11-13 03:10:23