2013-02-12 44 views
2

我已經在這裏做了相當數量的閱讀,並瞭解到我應該避免操縱formula objects作爲字符串,但我沒有遇不到如何以安全的方式做到這一點:正確的方法來追加公式,其中公式和要附加的東西都是參數

tf <- function(formula = NULL, data = NULL, groups = NULL, ...) { 
# Arguments are unquoted and in the typical form for lm etc 
# Do some plotting with lattice using formula & groups (works, not shown) 
# Append 'groups' to 'formula': 
# Change y ~ x as passed in argument 'formula' to 
# y ~ x * gr where gr is the argument 'groups' with 
# scoping so it will be understood by aov 
new_formula <- y ~ x * gr 
# Now do some anova (could do if formula were right) 
model <- aov(formula = new_formula, data = data) 
# And print the aov table on the plot (can do) 
print(summary(model)) # this will do for testing 
} 

也許我來到最接近的是使用reformulate但只給+在RHS,不*。我想要使​​用這樣的功能:

p <- tf(carat ~ color, groups = clarity, data = diamonds) 

並且具有carat_color *清晰度的aov結果。提前致謝。

解決方案

這是基於@亞倫的評論一個工作版本,這表明發生了什麼:

tf <- function(formula = NULL, data = NULL, groups = NULL, ...) { 
print(deparse(substitute(groups))) 
f <- paste(".~.*", deparse(substitute(groups))) 
new_formula <- update.formula(formula, f) 
print(new_formula) 
model <- aov(formula = new_formula, data = data) 
print(summary(model)) 
} 

回答

3

我覺得update.formula可以解決你的問題,但我已經遇到了麻煩在函數調用中更新。它會按照我在下面編碼它的方式工作,但請注意我將列傳遞給組,而不是變量名。然後將該列添加到函數數據集中,然後進行更新。

我也不知道在第二個方程中它是否正是你想要的,但是看看update.formula的幫助文件並稍微處理一下。

http://stat.ethz.ch/R-manual/R-devel/library/stats/html/update.formula.html

tf <- function(formula,groups,d){ 
    d$groups=groups 
    newForm = update(formula,~.*groups) 
    mod = lm(newForm,data=d) 
} 

dat = data.frame(carat=rnorm(10,0,1),color=rnorm(10,0,1),color2=rnorm(10,0,1),clarity=rnorm(10,0,1)) 
m = tf(carat~color,dat$clarity,d=dat) 
m2 = tf(carat~color+color2,dat$clarity,d=dat) 

tf2 <- function(formula, group, d) { 
    f <- paste(".~.*", deparse(substitute(group))) 
    newForm <- update.formula(formula, f) 
    lm(newForm, data=d) 
} 
mA = tf2(carat~color,clarity,d=dat) 
m2A = tf2(carat~color+color2,clarity,d=dat) 

編輯: 作爲@Aaron指出,這是deparsesubstitute是解決我的問題:我已經添加tf2爲更好的選擇的代碼示例,所以你可以看到兩個是如何工作的。

+0

感謝您看這個@slammaster我想我可能已經與'更新同樣的問題。公式'裏面的功能!對於調用的格子部分,我必須讓groups參數成爲數據框中某個事物的未加引號的名稱,所以我不能使用'dat $ clarity',我只能使用'clarity'作爲參數。因此,在追加組之後,lm或aov呼叫必須以相同的方式工作。 – 2013-02-12 19:25:03

+2

嘗試更新一個字符串(格式不好,因爲在評論中,對不起......):tf < - function(formula,group,d){ Aaron 2013-02-12 19:31:59

+0

@Aaron:應該發佈爲答案。 – 2013-02-12 19:35:58

0

當我在函數範圍內調用函數時遇到麻煩時,我使用的一種技術是將參數作爲字符串傳遞,然後在函數內從這些字符串構造函數。這就是這裏的樣子。

tf <- function(formula, data, groups) { 
    f <- paste(".~.*", groups) 
    m <- eval(call("aov", update.formula(as.formula(formula), f), data = as.name(data))) 
    summary(m) 
} 

tf("mpg~vs", "mtcars", "am") 

看到這個答案我以前的另外一個例子的一個問題:https://stackoverflow.com/a/7668846/210673

也看到這個答案,這其中的姐姐問題,在這裏我建議使用類似的東西與xyplothttps://stackoverflow.com/a/14858661/210673

+0

感謝您的其他建議和鏈接。我有我的函數的工作版本引用名稱作爲參數使用類似於您說明的方法。出於某種原因,我把它變成了我的腦袋,以轉換爲一個更「官方」或滑動的公式界面,這導致我陷入了這個泥潭!從長遠來看,我會變得更有見識,但是當我開始時,我的工作比我想象的要多得多。再次感謝。 – 2013-02-13 21:11:51

+0

我的答案在這裏也可能對未來的搜索者有用:http://stackoverflow.com/a/14940094/210673 – Aaron 2013-02-18 15:50:36

相關問題