是否有类似形式的[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)
感谢。
是否有类似形式的[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)
感谢。
我认为你可能在寻找outer
这不完全是你的代码所做的,但它很接近。具体而言,outer
将返回矩阵(即外部产品)或其前两个参数的元素的每个组合。
您可能想要存储结果,然后将较低的三角形作为矢量提取。事情是这样的,也许:
rs <- outer(1:4,-(5:7),"+")
rs[lower.tri(rs,diag = TRUE)]
[1] -4 -3 -2 -1 -4 -3 -2 -4 -3
它很容易与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
一个例子
func <- function(x,y) {sqrt(x^2+y^2)}
v1 <- c(1,3,5)
v2 <- c(0,-4,-12)
ret <- outer(v1,v2,"func")
你再有
> ret
[,1] [,2] [,3]
[1,] 1 4.123106 12.04159
[2,] 3 5.000000 12.36932
[3,] 5 6.403124 13.00000
或如果你想要什么你的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
谢谢!我如何定义一个自定义函数以在外部使用?你介意举个例子吗?我在尝试这些时遇到了错误,而且我的错误消息是中文的,所以我猜测发布它们会有一点帮助。 –
@SpiritZhang:'emulatesum <-function(x,y)return(x + y)'作为函数,然后是rs < - outer(1:4, - (5:7),“emulatesum”)'。顺便说一句:我强烈建议在英文中使用R,特别是对于错误消息:当你使用英文搜索它们时,使用Google搜索它们会容易得多... –
@NickSabbe:谢谢Nick!我在安装R时没注意语言。由于我在中国,我想这就是为什么R使中文成为默认语言的原因。 –