2015-10-20 18 views
0

說我寫了下面的目的,一個方程,eqn.r,使用R中的sprintf的命令,其值根據輸入的向量,pizza有一個對象是與sprintf的書面的方程評估中的R

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

當我鍵入eqn.r到R控制檯我得到這個:

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

我希望它實際上評估,並打印這樣的:

> sum((pizza - mean(pizza,na.rm=T))^2,na.rm=T) 
[1] 82.5 
+3

使用'「比薩」,「比薩」'的'的sprintf()'然後就可以評估'eval(parse(text = eqn.r))',但這並不是在世界歷史上任何地方都推薦過的。爲什麼你甚至需要一個字符串?只需使用最後一行。 –

+0

@RichardScriven我正在寫一個命令,將輸入數據集和該數據集中的變量名稱(在此示例中爲披薩)作爲輸入,我想在數據集中的變量上運行一個此方程,每個方程由用戶到特定的功能。所以:f(數據,披薩){eqn}。 – colin

回答

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 
相關問題