为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕容森 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代码。可以找到更多关于这个有用函数的信息。这里:

希望能帮上忙!


查看完整回答
反对 回复 2019-06-18
  • 3 回答
  • 0 关注
  • 550 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信