有一些';交叉应用';R中的函数?

有一些';交叉应用';R中的函数?,r,R,R中是否有如下形式的函数: crossApply(v1, v2, func) 具有与以下相同的功能: ret = c() i = 1 for (e1 in v1) { for (e2 in v2) { ret[i] <- func(e1,e2) i <- i + 1 } } return(ret) ret=c() i=1 用于(v1中的e1){ 用于(v2中的e2){ ret[i]我认为您可能正在寻找outer,这与您的代码所做的并不完全相同,但非常接近。

R中是否有如下形式的函数:

crossApply(v1, v2, func)
具有与以下相同的功能:

ret = c()
i = 1
for (e1 in v1) {
  for (e2 in v2) {
    ret[i] <- func(e1,e2)
    i <- i + 1
  }
}
return(ret)
ret=c()
i=1
用于(v1中的e1){
用于(v2中的e2){

ret[i]我认为您可能正在寻找
outer
,这与您的代码所做的并不完全相同,但非常接近。具体地说,
outer
将返回矩阵(即外积)或其前两个参数的元素组合

您可能希望存储结果,然后将下三角提取为向量。类似于以下内容:

rs <- outer(1:4,-(5:7),"+")
rs[lower.tri(rs,diag = TRUE)]
[1] -4 -3 -2 -1 -4 -3 -2 -4 -3

rs使用
do.call
expand.grid
很容易:

x <- seq(0,10, length.out=10)
> y <- seq(-1,1, length.out=5)
> d1 <- expand.grid(x=x, y=y)  
> do.call("*", d1)
 [1]   0.0000000  -1.1111111  -2.2222222  -3.3333333  -4.4444444
 [6]  -5.5555556  -6.6666667  -7.7777778  -8.8888889 -10.0000000
[11]   0.0000000  -0.5555556  -1.1111111  -1.6666667  -2.2222222
[16]  -2.7777778  -3.3333333  -3.8888889  -4.4444444  -5.0000000
[21]   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000
[26]   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000
[31]   0.0000000   0.5555556   1.1111111   1.6666667   2.2222222
[36]   2.7777778   3.3333333   3.8888889   4.4444444   5.0000000
[41]   0.0000000   1.1111111   2.2222222   3.3333333   4.4444444
[46]   5.5555556   6.6666667   7.7777778   8.8888889  10.0000000
x y d1 do.call(“*”,d1)
[1]   0.0000000  -1.1111111  -2.2222222  -3.3333333  -4.4444444
[6]  -5.5555556  -6.6666667  -7.7777778  -8.8888889 -10.0000000
[11]   0.0000000  -0.5555556  -1.1111111  -1.6666667  -2.2222222
[16]  -2.7777778  -3.3333333  -3.8888889  -4.4444444  -5.0000000
[21]   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000
[26]   0.0000000   0.0000000   0.0000000   0.0000000   0.0000000
[31]   0.0000000   0.5555556   1.1111111   1.6666667   2.2222222
[36]   2.7777778   3.3333333   3.8888889   4.4444444   5.0000000
[41]   0.0000000   1.1111111   2.2222222   3.3333333   4.4444444
[46]   5.5555556   6.6666667   7.7777778   8.8888889  10.0000000
一个例子

func <- function(x,y) {sqrt(x^2+y^2)}
v1 <- c(1,3,5)
v2 <- c(0,-4,-12)
ret <- outer(v1,v2,"func")
或者如果您想要的正是for循环将产生的结果

> as.vector(t(ret))
[1]  1.000000  4.123106 12.041595  3.000000  5.000000 12.369317  5.000000
[8]  6.403124 13.000000

很好,但请注意,在这种情况下,只有向量化函数才能使用
do.call
。例如,do.call(mean,d1)失败。因此,可能应该是
do.call(“mapply”,c(fun,d1))
。有趣的想法。它似乎与
do.call(expand.grid()
Vectorize
如何处理
sapply
。谢谢!我如何定义一个在外部使用的自定义函数?你介意举个例子吗?我在尝试这个过程中不断遇到错误,我的错误消息是中文的,所以我想发布这些消息对我帮助不大。@SpiritZhang:
emulatesum@NickSabbe:谢谢尼克!我我安装R时没有太注意语言。因为我在中国,我想这就是R将中文作为默认语言的原因。
> as.vector(t(ret))
[1]  1.000000  4.123106 12.041595  3.000000  5.000000 12.369317  5.000000
[8]  6.403124 13.000000