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

col*_*lin 0 r

假设我编写了以下对象,一个等式,eqn.r使用R中的sprintf命令,根据输入向量进行求值,pizza:

eqn.r<- sprintf("sum((%s - mean(%s,na.rm=T))^2,na.rm=T)",pizza,pizza)
pizza<-c(1:10)
Run Code Online (Sandbox Code Playgroud)

当我输入eqn.rR控制台时,我得到了这个:

"sum((pizza - mean(pizza,na.rm=T))^2,na.rm=T)"
Run Code Online (Sandbox Code Playgroud)

我希望它实际评估,并打印这个:

> sum((pizza - mean(pizza,na.rm=T))^2,na.rm=T)
[1] 82.5
Run Code Online (Sandbox Code Playgroud)

jos*_*ber 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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)