R 计算公式列表中的公式

标签 r eval

我有一个这样的公式列表:

ATi<-list(quote(-(1/(C1 * Rf) + (1/(C1 * Rc) + (1/(C1 * Rint) + 1/(C1 * Rei))))),

      quote(1/(C1 * Rei)), 0, quote(1/(C1 * Rint)), quote(1/(C1 * Rf)),
      quote(1/(C1 * Rc)), 0, 0)

List of 8
$ : language -(1/(C1 * Rf) + (1/(C1 * Rc) + (1/(C1 * Rint) + 1/(C1 * Rei))))
$ : language 1/(C1 * Rei)
$ : num 0
$ : language 1/(C1 * Rint)
$ : language 1/(C1 * Rf)
$ : language 1/(C1 * Rc)
$ : num 0
$ : num 0

我想在插入其他列表中的每个参数的值后评估每个公式。作为输出,我想要一个结果列表。 我尝试了不同的方法,但我确实找到了解决方案。我有几个这样的东西,我想要一个智能的解决方案来自动化这个过程。

首先我插入参数的值。 ATi 是我的列表名称,value 是存储参数值和名称的列表。

   value<-c( 0.110546010137993, 9.95953827321208, 7.1751380374394, 285.658095052437,
   285.967649817749) 

   names(value)<-c( "C1", "Rc", "Rei", "Rf", "Rint")

ATi<-gsub("C1",value[["C1"]],ATi)
ATi<-gsub("Rf",value[["Rf"]],ATi)
ATi<-gsub("Rc",value[["Rc"]],ATi)
ATi<-gsub("Rint",value[["Rint"]],ATi)
ATi<-gsub("Rei",value[["Rei"]],ATi)

结果看起来不错,但现在我有一个字符列表,我需要一个表达式来进行评估。所以我使用解析。

ATi<-parse(text=ATi)
ATi<-eval(ATi)

这个结果是 0,这是不正确的。我期望得到一个 8 个数字的列表,其中只有 3 个 0。 我认为错误出在解析上,因为应用解析的结果是:

structure(expression(-(1/(0.110546010137993 * 285.658095052437) + 
(1/(0.110546010137993 * 9.95953827321208) + (1/(0.110546010137993 * 285.967649817749)
+ 1/(0.110546010137993 * 7.1751380374394)))), 
1/(0.110546010137993 * 7.1751380374394), 0, 1/(0.110546010137993 * 285.967649817749), 
1/(0.110546010137993 * 285.658095052437), 1/(0.110546010137993 * 9.95953827321208), 
0, 0), 
srcfile = <environment>, wholeSrcref = structure(c(1L, 0L, 9L, 0L, 0L, 0L, 1L, 9L),
srcfile = <environment>, class = "srcref"))

似乎我只有一个表达式,而不是 8,所以我只有一个结果。

我也尝试单独评估每个公式,在这种情况下我有不同的错误。 对于第一个公式,使用上面的代码没有问题。 对于第二个,解析不起作用,因为他不喜欢“/”。

第二个公式是:

a<-quote(1/(C1 * Rei))
a<-gsub("C1",value[["C1"]],a)
a<-gsub("Rei",value[["Rei"]],a)

使用 gsub 后,看起来已经连线了

c("/", "1", "(0.110546010137993 * 7.1751380374394)")

因此,可能当我应用解析时..

a<-parse(text=a)
Error in base::parse(...) : <text>:1:1: unexpected '/'
1: /
   ^

任何想法都会受到赞赏。谢谢

最佳答案

gsub 用于字符串,而不是用于 language 对象。 (请注意,公式R中的对象类(不是您这里的)

如果您想计算给定一组参数的值(结果),请使用eval

如果你想替换值并返回语言对象,则需要一些do.callsubstitute、技巧

# a smaller example

l <- list(quote(-(1/(C1 * Rf) + (1/(C1 * Rc) + (1/(C1 * Ree) + 1/(C1 * Rei)))))
,quote(1/(C1 * Rei)), 0)

ATi <- list(C1  = 0.11054601,
            Ra  =   0.04522716,
            Rc  =   9.95953827,
            Ree =   1.65135221,
            Rei =   7.17513804,
            Rf  = 285.65809505)



# to find result use eval

sapply(l, eval, env= ATi)
# [1] -7.678626  1.260743  0.000000

# to substitute values for symbols

lapply(l, function(x) eval(do.call('substitute',list(enquote(x), env = ATi))))
str(res)
# List of 3
# $ : language -(1/(0.11054601 * 285.65809505) + (1/(0.11054601 *      9.95953827) + (1/(0.11054601 * 1.65135221) + 1/(0.11054601 *  ...
# $ : language 1/(0.11054601 * 7.17513804)
# $ : num 0

关于R 计算公式列表中的公式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18501578/

相关文章:

javascript - 使用 eval 使用字符串输入按名称将函数分配给变量有哪些风险?

r - simple_triplet_matrix 中的错误——无法使用 RWeka 来计算 Phrases

r - 在 Linux 中调用 R

r - Shiny :selectizeInput 和 textInput 的组合可能吗?

r - Mongo Atlas DB 到 Rstudio

R: "In eval(ei, envir) : NAs introduced by coercion"是什么原因导致的?

html - print.xtable 弄乱了 html 标签

python - 使用 Python 的 eval() 时,locals 和 globals 有什么区别?

python - ast.literal_eval 用于 python 中的变量?

lambda - 艾伦·凯的评估/应用爱因斯坦时刻