我正在學習使用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。 :■
在R中用'function'創建一個匿名函數相當於Python中的'lambda'。你想要達到什麼樣的靈活性?您可以在循環或應用函數中創建這些匿名函數。 – 2014-11-09 06:41:03
我添加了一個簡短的例子,我正在試圖獲取。 – 2014-11-09 07:03:32
以字符串形式創建函數並對其進行評估看起來不像R。你想達到什麼目的?如果我們知道最終目標是什麼,也許我們可以從不同的角度闡明一些看法。 – 2014-11-09 08:10:48