亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

什么是具體的危險的評估(解析(…)?

什么是具體的危險的評估(解析(…)?

慕容森 2019-06-18 17:02:40
什么是具體的危險的評估(解析(…)?關于如何避免使用eval(parse(...))r-value解析-是-通常是次優的。避免臭名昭著的-評估解析-構造這引發了問題:為什么特別要eval(parse())被回避?最重要的是,危險是什么?如果代碼不用于生產,是否有任何危險?(我在想,任何意外結果的危險。顯然,如果您不小心正在解析什么,您就會有問題。但這比粗心大意更危險嗎?get()?)
查看完整描述

3 回答

?
胡子哥哥

TA貢獻1825條經驗 獲得超6個贊

大多數反對eval(parse(...))起立畢竟,出于安全考慮,沒有人聲稱R是向互聯網公開的安全接口,而是因為這樣的代碼通常是可以使用不那么晦澀的方法來完成的,也就是既更快又更人性化的解析方法。R語言應該是高級語言,所以cognoscenti(我不認為自己在這個組中)的首選是看到既緊湊又富有表現力的代碼。

所以危險在于eval(parse(..))這是一種繞過知識匱乏的后門方法,而提高這一障礙的希望在于人們將改進他們對R語言的使用。門仍然敞開著,但希望更多地利用其他功能。卡爾·維托夫特今天早些時候的問題圖解不知道get函數是可用的,并且他所涉及的問題暴露了對[[函數的行為(以及如何表現)$[[)。在這兩種情況下eval(parse(..))解決方案是可以構建的,但它比替代方案更笨重,也不那么清晰。


查看完整回答
反對 回復 2019-06-18
?
一只甜甜圈

TA貢獻1836條經驗 獲得超5個贊

只有當您開始調用另一個用戶傳遞給您的字符串時,安全性問題才會真正出現。如果您正在創建一個在后臺運行R的應用程序,這是一個很大的問題,但是對于您要自己編寫代碼的數據分析,則不需要擔心eval關于保安。

其他一些問題eval(parse(盡管如此。

首先,使用val-Analysis的代碼通常比非解析代碼更難調試,這是有問題的,因為調試軟件是兩倍難一開始就寫出來了。

這是一個有錯誤的函數。

std <- function(){
  mean(1to10)}

愚蠢的我,我已經忘記了冒號運算符,并錯誤地創造了我的向量。如果我嘗試并獲得這個函數,R就會注意到這個問題并拋出一個錯誤,指出我的錯誤。

這是最早的解析版本。

ep <- function(){
  eval(parse(text = "mean(1to10)"))}

這,這個將要源,因為錯誤位于有效字符串中。直到稍后,當我們開始運行代碼時,才會拋出錯誤。因此,通過使用val-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


查看完整回答
反對 回復 2019-06-18
?
湖上湖

TA貢獻2003條經驗 獲得超2個贊

在我的經驗中,通常有一種比使用代碼字符串更好的“在語言上計算”的方法;根據我的經驗,高級代碼需要大量的安全保護來保證合理的輸出。

相同的任務通??梢酝ㄟ^直接將R代碼作為語言對象來解決;Hadley Wickham對R中的元編程有一個有用的指南。這里:

gtools庫中的Def宏()函數是我最喜歡的替代方法(沒有半途而廢的R雙關語)。

require(gtools)# both action_to_take & predicate will be subbed with codeF <- defmacro(predicate, action_to_take, expr = 
    if(predicate) action_to_take)F(1 != 1, action_to_take = print('arithmetic doesnt work!'))F(pi > 3, action_to_take = return('good!'))[1]
     'good!'# the raw code for Fprint(F)function (predicate = stop("predicate not supplied"), action_to_take = stop("action_to_take not
      supplied")) {
    tmp <- substitute(if (predicate) action_to_take)
    eval(tmp, parent.frame())}<environment: 0x05ad5d3c>

這種方法的好處是,您可以得到語法上合法的R代碼??梢哉业礁嚓P于這個有用函數的信息。這里:

希望能幫上忙!


查看完整回答
反對 回復 2019-06-18
  • 3 回答
  • 0 關注
  • 596 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號