什么是具体的危险的评估(解析(…)?

什么是具体的危险的评估(解析(…)?

关于如何避免使用eval(parse(...))

这引发了问题:

  • 为什么特别要

    eval(parse())

    被回避?
  • 最重要的是,危险是什么?
    • 如果代码不用于生产,是否有任何危险?(我在想,任何意外结果的危险。显然,如果您不小心正在解析什么,您就会有问题。但这比粗心大意更危险吗?

      get()?)


慕容森
浏览 551回答 3
3回答

胡子哥哥

大多数反对eval(parse(...))起立不毕竟,出于安全考虑,没有人声称R是向互联网公开的安全接口,而是因为这样的代码通常是可以使用不那么晦涩的方法来完成的,也就是既更快又更人性化的解析方法。R语言应该是高级语言,所以cognoscenti(我不认为自己在这个组中)的首选是看到既紧凑又富有表现力的代码。所以危险在于eval(parse(..))这是一种绕过知识匮乏的后门方法,而提高这一障碍的希望在于人们将改进他们对R语言的使用。门仍然敞开着,但希望更多地利用其他功能。卡尔·维托夫特今天早些时候的问题图解不知道get函数是可用的,并且他所涉及的问题暴露了对[[函数的行为(以及如何表现)$比[[)。在这两种情况下eval(parse(..))解决方案是可以构建的,但它比替代方案更笨重,也不那么清晰。

一只甜甜圈

只有当您开始调用另一个用户传递给您的字符串时,安全性问题才会真正出现。如果您正在创建一个在后台运行R的应用程序,这是一个很大的问题,但是对于您要自己编写代码的数据分析,则不需要担心eval关于保安。其他一些问题eval(parse(尽管如此。首先,使用val-Analysis的代码通常比非解析代码更难调试,这是有问题的,因为调试软件是两倍难一开始就写出来了。这是一个有错误的函数。std&nbsp;<-&nbsp;function(){ &nbsp;&nbsp;mean(1to10)}愚蠢的我,我已经忘记了冒号运算符,并错误地创造了我的向量。如果我尝试并获得这个函数,R就会注意到这个问题并抛出一个错误,指出我的错误。这是最早的解析版本。ep&nbsp;<-&nbsp;function(){ &nbsp;&nbsp;eval(parse(text&nbsp;=&nbsp;"mean(1to10)"))}这,这个将要源,因为错误位于有效字符串中。直到稍后,当我们开始运行代码时,才会抛出错误。因此,通过使用val-parse,我们已经失去了源时错误检查功能。我还认为这个函数的第二个版本要难读得多。另一个问题是与直接执行的代码相比它要慢得多。比较system.time(for(i&nbsp;in&nbsp;seq_len(1e4))&nbsp;mean(1:10)) &nbsp;&nbsp;&nbsp;user&nbsp;&nbsp;system&nbsp;elapsed&nbsp; &nbsp;&nbsp;&nbsp;0.08&nbsp;&nbsp;&nbsp;&nbsp;0.00&nbsp;&nbsp;&nbsp;&nbsp;0.07和system.time(for(i&nbsp;in&nbsp;seq_len(1e4))&nbsp;eval(parse(text&nbsp;=&nbsp;"mean(1:10)"))) &nbsp;&nbsp;&nbsp;user&nbsp;&nbsp;system&nbsp;elapsed&nbsp; &nbsp;&nbsp;&nbsp;1.54&nbsp;&nbsp;&nbsp;&nbsp;0.14&nbsp;&nbsp;&nbsp;&nbsp;1.69

湖上湖

在我的经验中,通常有一种比使用代码字符串更好的“在语言上计算”的方法;根据我的经验,高级代码需要大量的安全保护来保证合理的输出。相同的任务通常可以通过直接将R代码作为语言对象来解决;Hadley Wickham对R中的元编程有一个有用的指南。这里:gtools库中的Def宏()函数是我最喜欢的替代方法(没有半途而废的R双关语)。require(gtools)#&nbsp;both&nbsp;action_to_take&nbsp;&&nbsp;predicate&nbsp;will&nbsp;be&nbsp;subbed&nbsp;with&nbsp;codeF&nbsp;<-&nbsp;defmacro(predicate,&nbsp;action_to_take,&nbsp;expr&nbsp;=&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;if(predicate)&nbsp;action_to_take)F(1&nbsp;!=&nbsp;1,&nbsp;action_to_take&nbsp;=&nbsp;print('arithmetic&nbsp;doesnt&nbsp;work!'))F(pi&nbsp;>&nbsp;3,&nbsp;action_to_take&nbsp;=&nbsp;return('good!'))[1] &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'good!'#&nbsp;the&nbsp;raw&nbsp;code&nbsp;for&nbsp;Fprint(F)function&nbsp;(predicate&nbsp;=&nbsp;stop("predicate&nbsp;not&nbsp;supplied"),&nbsp;action_to_take&nbsp;=&nbsp;stop("action_to_take&nbsp;not &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;supplied"))&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;<-&nbsp;substitute(if&nbsp;(predicate)&nbsp;action_to_take) &nbsp;&nbsp;&nbsp;&nbsp;eval(tmp,&nbsp;parent.frame())}<environment:&nbsp;0x05ad5d3c>这种方法的好处是,您可以得到语法上合法的R代码。可以找到更多关于这个有用函数的信息。这里:希望能帮上忙!
打开App,查看更多内容
随时随地看视频慕课网APP