Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R中反向波兰符号的评价_R_Parsing_Rpn - Fatal编程技术网

R中反向波兰符号的评价

R中反向波兰符号的评价,r,parsing,rpn,R,Parsing,Rpn,在R中计算RPN符号最有效的算法是什么 问题是:假设我们有 c("4", "13", "5", "/", "+") -> (4 + (13 / 5)) -> 6 如何编写计算任何输入RPN的通用函数 R是否具有堆栈数据结构 谢谢你的提示据我所知,没有一个专门的堆栈结构,你可以推送/弹出等,但你可以很容易地使用列表来实现同样的效果。在这里,我们使用相同的列表来保存输入RPN字符串并充当堆栈: rpn <- function(v) { l <- lapply(v, fu

在R中计算RPN符号最有效的算法是什么

问题是:假设我们有

c("4", "13", "5", "/", "+") -> (4 + (13 / 5)) -> 6
如何编写计算任何输入RPN的通用函数

R是否具有堆栈数据结构


谢谢你的提示

据我所知,没有一个专门的堆栈结构,你可以推送/弹出等,但你可以很容易地使用列表来实现同样的效果。在这里,我们使用相同的列表来保存输入RPN字符串并充当堆栈:

rpn <- function(v) {
  l <- lapply(v, function(x) if(grepl("^\\d+$", x)) as.numeric(x) else as.name(x))
  i <- 1
  while(length(l) >= i) {
    if(!is.numeric(l[[i]])) {
      l[[i - 2]] <- as.call(l[c(i, i - 2, i - 1)])
      l[i:(i - 1)] <- NULL
      i <- i - 1
    } else i <- i + 1
  }
  l[[1]]      
}

rpn巧合的是,几天前。也许这个要点中的某些东西会对你有用。你几乎可以肯定地通过构造
call
对象来欺骗和破解它。哈德利·威克姆的书中有一章是关于这一点的process@ssdecontrol,为什么会作弊?这里的
match.fun
有意义吗?我从来没有明确使用过它,但它似乎是
*apply
@ssdecontrol背后的机制,讽刺的是,没有,你特别不想使用
match.fun
。将
as.call(list(match.fun(“+”,1,2))与
as.call(list(as.name(“+”,1,2))
进行比较。在后一种情况下,R将
+
识别为运算符,而在前一种情况下,R不识别。这两种情况都有效,但使用
as.name
也会以可识别的形式生成算术表达式。@BrodieG
rstack
pkg和
rstackdeque
一样,都有堆栈结构。
v <- c("4", "13", "5", "/", "+")
rpn(v)              # un-evaluated reparsed expression
# 4 + 13/5
eval(rpn(v))        # which you can evaluate
# [1] 6.6
v <- c("4", "13", "+", "5", "/", "8", "-", "10", "3", "+", "*")
rpn(v)
# ((4 + 13)/5 - 8) * (10 + 3)
eval(rpn(v))
# [1] -59.8