只有當您開始對另一個用戶傳給您的字符串調用eval時,纔會出現安全問題。如果您要創建一個在後臺運行R的應用程序,但對於要編寫自己運行的代碼的數據分析,則這是一件大事,那麼您應該不必擔心eval
對安全性的影響。
但eval(parse(
的一些其他問題。
首先,使用eval-parse的代碼通常比非分析代碼更難調試,這是有問題的,因爲調試軟件是twice as difficult寫在首位。
這是一個錯誤的函數。
std <- function()
{
mean(1to10)
}
傻了,我忘記了冒號操作符,並錯誤地創建了我的向量。如果我試着找到這個函數,那麼R會注意到這個問題並拋出一個錯誤,指出我的錯誤。
下面是eval-parse版本。
ep <- function()
{
eval(parse(text = "mean(1to10)"))
}
這將源,因爲錯誤是一個有效的字符串中。只是在以後,當我們來運行錯誤引發的代碼時。所以通過使用eval-parse,我們失去了源時間錯誤檢查功能。
我也認爲這個函數的第二個版本更難讀。
eval-parse的另一個問題是它比直接執行的代碼慢得多。比較
system.time(for(i in seq_len(1e4)) mean(1:10))
user system elapsed
0.08 0.00 0.07
和
system.time(for(i in seq_len(1e4)) eval(parse(text = "mean(1:10)")))
user system elapsed
1.54 0.14 1.69
我不知道我有沒有時間去創造一個很好的例子/寫正確的答案,但我在這個方向頭痛有更多的事情要做'的eval()'一般比'的eval(解析( ))'。 'eval()'的問題在於它試圖遵循一些基本的但常常難以理解的關於表達式被評估的框架的規則,當你以更復雜的方式開始使用代碼構造時,這些規則通常會咬你不是筆者原本以爲... http://obeautifulcode.com/R/How-R-Searches-And-Finds-Stuff/ –
@BenBolker的,這個問題似乎仍然可以打很多的搜索結果。如果您想您的評論闡述上面,我很想聽到更多你的想法,因爲我相信其他人會以及 –
@Ricardo薩波塔,你似乎很喜歡使用'data.table'。有趣的是,我跨越[交]來到(https://stackoverflow.com/a/10676138/5193830)其中解釋了'eval'可以比'GET'更快在某些情況下與'data.table' – Valentin