2014-02-21 78 views
7

我想發送與SendMailR數據幀。我可以將它作爲附件以合理的格式發送。不過,我想發送電子郵件正文中的數據框。我嘗試了capture.output,print,sprintf,但我甚至無法將格式關閉。電子郵件數據框與SendMailR電子郵件正文中的表

例如我想下面的語法

for (i in 1:nrow(df)){ 
MSG = c(MSG,rownames(df)[1],as.character(unlist(df[i,])),'\n') 
} 
MSG = sprintf('%-10s',MSG) 
sendmail(from,to,subject,msg = list(MSG,attachment1,attachment2 ...)) 

換句話說,我想,這可能需要我的數據幀轉換成具有/ N和sprintf(「S-10%」)等格式並存儲在MSG 。有人能指引我朝着正確的方向嗎?

+0

我建議你創建一個HTML表,但我相信你不能發送HTML郵件與sendmailR。 –

+0

謝謝Julien。就像編輯一樣,我只需要每天通過電子郵件發送一份工作的結果。我很高興使用另一個郵件發件人/更改數據框到數據表/矩陣等,只要我可以在電子郵件正文中發送內容。樂於考慮任何替代品 – hjw

回答

15

雖然發送HTML郵件與sendmailR不是簡單明瞭,但有可能基於與去年包的作者(再次感謝奧拉夫Mersmann他的熱心幫助)郵件的討論 - 與簡單地重寫Content-Type頭。例如: -

msg <- mime_part('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 
Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
    <meta name="viewport" content="width=device-width, initial-scale=1.0"/> 
    <title>HTML demo</title> 
    <style type="text/css"> 
    </style> 
</head> 
<body> 
<h1>HTML demo</h1> 
</body> 
</html>') 

## Override content type. 
msg[["headers"]][["Content-Type"]] <- "text/html" 

from <- '<[email protected]>' 
to  <- "<[email protected]>" 
subject <- "HTML test" 
body <- list(msg) 
sendmail(from, to, subject, body, ...) 

在另一方面,沒有真正需要HTML呈現表或在人類可讀的格式data.frame。有例如ascii包或我的pander pkg,可以將R對象變爲降價。快速演示:

> library(pander) 
> panderOptions('table.split.table', Inf) 
> pander(head(iris, 3)) 

------------------------------------------------------------------- 
Sepal.Length Sepal.Width Petal.Length Petal.Width Species 
-------------- ------------- -------------- ------------- --------- 
    5.1   3.5   1.4   0.2  setosa 

    4.9    3   1.4   0.2  setosa 

    4.7   3.2   1.3   0.2  setosa 
------------------------------------------------------------------- 

> pander(head(iris, 3), style = 'grid') 


+----------------+---------------+----------------+---------------+-----------+ 
| Sepal.Length | Sepal.Width | Petal.Length | Petal.Width | Species | 
+================+===============+================+===============+===========+ 
|  5.1  |  3.5  |  1.4  |  0.2  | setosa | 
+----------------+---------------+----------------+---------------+-----------+ 
|  4.9  |  3  |  1.4  |  0.2  | setosa | 
+----------------+---------------+----------------+---------------+-----------+ 
|  4.7  |  3.2  |  1.3  |  0.2  | setosa | 
+----------------+---------------+----------------+---------------+-----------+ 

如果你想連接到這個電子郵件的身體,用pander.return而不是返回特徵向量,而不是寫到控制檯。還有一些其他可用的表格style,也有一些有用的panderOptions例如設置小數點,日期格式等:http://rapporter.github.io/pander/

+1

非常感謝您的幫助。我沒有設法讓pandoc.return在電子郵件中工作(格式在Rstudio中看起來不錯,但是在我的電子郵件中沒有......線沒有對齊),但html運行良好。 – hjw

+0

@hjw也許你可以在添加電子郵件前粘貼(',collapse ='\ n')'pander.return'的內容,或者發送HTML郵件時'collapse ='
''。 – daroczig

+1

函數的正確名稱是'pander_return' –

2

庫「xtable」將幫助附加數據框作爲電子郵件中的表。試試這個

library(xtable) 

    body=print(xtable(dataframe,caption = "Heading for the table"), type="html", caption.placement = "top") 
+0

這個問題已經兩年了,並且有一個公認的高質量答案。指出你的答案對給定的答案有什麼新貢獻,或者它可能會被刪除。 – kaetzacoatl

+0

我在同一個問題上掙扎。以爲我的病情有人會得到一些幫助。 –