2013-02-12 1 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) 

및 캐럿 ~ 색상 * 명확성을 위해 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

감사 :

또한 내가 xyplot와 함께 사용하기 위해 비슷한 제안이 하나의 자매 질문이 대답을 참조하십시오. 수식'함수 안에! 호출의 격자 부분에 대해서는 그룹 인수에 데이터 프레임에서 무언가의 인용되지 않은 이름이 있어야하므로 'dat $ clarity'를 사용할 수 없으므로 인수로 '선명도'를 사용해야합니다. . 따라서'lm' 또는'aov' 호출은 그룹을 추가 한 후에 같은 방식으로 작동해야합니다. –

+2

문자열을 업데이트하려고 시도합니다 (주석으로 인해 형식이 잘못되었습니다 ... 죄송합니다 ...) : tf <- function (formula, group, d) { f <- paste (". ~. *", deparse 그룹))); lm (update.formula (formula, f), data = d) } – Aaron

+0

@Aaron : 답변으로 게시해야합니다. –

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에 대한 대답을 참조하십시오. 내가 업데이 트 '와 같은 문제를했을 수 있습니다 생각이 @slammaster보고에 대한 https://stackoverflow.com/a/14858661/210673

+0

추가 제안 사항 및 링크를 제공해 주셔서 감사합니다. 필자가 설명하는 것과 비슷한 메서드를 사용하여 인수로 인용 된 이름을 사용하는 버전의 제 함수를 사용하고 있습니다. 어떤 이유에서 나는 더 많은 '공식'또는 더 매끄러운 공식 인터페이스로 전환하기 위해 머리 속에 넣었습니다. 그 덕분에 저를이 수렁에 빠지게했습니다! 장기적으로 더 많은 지식을 갖게 될 것이지만, 시작했을 때 생각했던 것보다 훨씬 많은 작업이 필요했습니다. 다시 한번 감사드립니다. –

+0

내 대답은 미래의 검색 자에게 유용 할 수 있습니다. http://stackoverflow.com/a/14940094/210673 – Aaron