假设我编写了以下对象,一个等式,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)
给定存储为字符串的变量名称,您可以使用标准索引从传递的数据框中获取变量的数据.在一般情况下,这是非常优选以生成与类似代码sprintf或paste然后解析和评估该代码.
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)