有一个对象是用r中的sprintf求值编写的等式

时间:2015-10-20 22:45:17

标签: r

假设我使用R中的sprintf命令编写了以下对象,方程式<input name="somename" id="someid" type="hidden" value="<?php $var ?>"> ,该命令基于输入向量eqn.r进行评估:

pizza

当我在R控制台中输入eqn.r<- sprintf("sum((%s - mean(%s,na.rm=T))^2,na.rm=T)",pizza,pizza) pizza<-c(1:10) 时,我得到了这个:

eqn.r

我希望它实际评估,并打印出来:

"sum((pizza - mean(pizza,na.rm=T))^2,na.rm=T)"

1 个答案:

答案 0 :(得分:5)

给定存储为字符串的变量名称,您可以使用标准索引从传递的数据帧中获取变量的数据。通常,这比使用sprintfpaste生成代码然后解析和评估该代码更受欢迎。

f <- function(dat, vname) sum((dat[,vname] - mean(dat[,vname], na.rm=T))^2, na.rm=T)
f(iris, "Sepal.Length")
# [1] 102.1683

如果你想在变量名称周围没有引号的情况下调用你的函数,你可以这样做:

f2 <- function(dat, vname) {
  m <- match.call()
  x <- with(eval(m[["dat"]]), eval(m[["vname"]]))
  sum((x - mean(x,na.rm=T))^2,na.rm=T)
}
f2(iris, Sepal.Length)
# [1] 102.1683