假设我有一个用户定义的乐趣
fun <- function(i,j,k){}
我正在寻找一个函数(),
function(fun, c(x1, x2), c(y1,y2), c(z1,z2))
执行
fun(x1,y1,z1)
fun(x1,y2,z1)
fun(x2,y1,z1)
fun(x2,y2,z1)
fun(x1,y1,z2)
fun(x1,y2,z2)
fun(x2,y1,z2)
fun(x2,y2,z2)
我虽然申请家人可以做这个工作。但是我找不到合适的人。
=============================================== ======================
这是我正在研究的一个真实例子,但仍然无法解决。
data <- read.table(header = TRUE, stringsAsFactors = FALSE,
text = "ID x1 x2 y1 y2
1 a T 100 2
2 b T 210 4
3 b F 112 5
4 a F 121 1
5 b F 412 1")
boxplot <- function(i,j){
print(ggplot(data,
aes_string(x=colnames(data)[i],
y=colnames(data)[j],
col=colnames(data)[i]))+
geom_boxplot())
}
然后您可以使用boxplot(2,4)
制作绘图,boxplot(3,4),boxplot(2,5),boxplot(3,5)也是如此。
然后我尝试了do.call并从答案中应用方法。
do.call(boxplot, as.list(unname(expand.grid(c(2, 3), c(4,5)))))
或
apply(expand.grid(c(2,3), c(4,5)),1,boxplot)
然而,它们没有按预期工作。
do.call方法只返回一个绘图,而apply one会返回8个绘图,但所有y轴都是ID。
=============================================== =======
for循环使它工作。有什么意见吗?
for (i in 2:3) {
for (j in 4:5) {
boxplot(i,j)
}
}
答案 0 :(得分:2)
试试这个:
sum3 <- function(x, y, z) x+y+z # test function
mapply(sum3, 1:3, 11:13, 21:23)
## [1] 33 36 39
此处sum3(1, 11, 21)
为33,sum3(2, 12, 22)
为36,sum3(3, 13, 23)
为39. ?mapply
帮助页面上有更多示例。
这也有效并返回一个列表:
Map(sum3, 1:3, 11:13, 21:23)
答案 1 :(得分:1)
x如果你提供reproducible example会很好,所以我们可以验证可能的解决方案,但我认为你可以通过exapand.grid
和do.call
得到你想要的。 <怎么样
do.call(fun, as.list(unname(expand.grid(c(x1, x2), c(y1,y2), c(z1,z2)))))
如果你有
fun <- function(i,j,k){i+j+k}
x1<-1; x2<-2;
y1<-10; y2<-20;
z1<-100; z2<-200;
你会得到
[1] 111 112 121 122 211 212 221 222
# x1+y1+z1, x2+y1+z1, x1+y2+z1, x2+y3+z1, ...
答案 2 :(得分:0)
如果我理解正确,这应该很简单
apply(expand.grid(c(x1, x2), c(y1,y2), c(z1,z2)),1,fun)
编辑:添加示例
x <-c(13,14)
y <- c(21,22)
z<- c(35,36)
apply(expand.grid(x,y,z),1,mean)
[1] 23.00000 23.33333 23.33333 23.66667 23.33333 23.66667 23.66667 24.00000