假设我有以下公式:
fr <- formula(y~myfun(x)+z)
Run Code Online (Sandbox Code Playgroud)
给定对象fr在R中有一个函数返回myfun(x)?我(下面的代码)写了我自己的功能,基本上做什么,我需要的,但也许有这样做的一些标准的方式吗?
我的功能代码:
selectmds <- function(expr,funcn) {
if(length(expr)>2) {
a <- expr[[2]]
b <- expr[[3]]
if(length(a)>1) {
if(as.name(a[[1]])==funcn) {
if(length(grep(funcn,all.names(b)))>0) {
return(list(a,selectmds(b,funcn)))
}
else return(list(a))
}
}
if(length(b)>1) {
if(as.name(b[[1]])==funcn) {
if(length(grep(funcn,all.names(a)))>0) {
return(list(b,selectmds(a,funcn)))
}
else return(list(b))
}
}
for(i in 2:length(expr)) {
if(length(grep(funcn,all.names(expr[[i]])))>0)return(selectmds(expr[[i]],funcn))
}
}
return(NULL)
}
Run Code Online (Sandbox Code Playgroud)
以下是几个例子:
> selectmds(formula(y~myfun(x)+z),"myfun")
[[1]]
myfun(x)
> unlist(selectmds(formula(y~myfun(x)+z+myfun(zz)),"myfun"))
[[1]]
myfun(zz)
[[2]]
myfun(x)
Run Code Online (Sandbox Code Playgroud)
不确定这是最好的,但你可以通过以下方式完成:
f <- function(fm, fun) {
l <- as.list(attr(terms(fm), "variables"))[-1]
l[grep(fun, l)]
}
Run Code Online (Sandbox Code Playgroud)
然后,
> f(formula(y~myfun(x)+z),"myfun")
[[1]]
myfun(x)
> f(formula(y~myfun(x)+z+myfun(zz)),"myfun")
[[1]]
myfun(x)
[[2]]
myfun(zz)
Run Code Online (Sandbox Code Playgroud)