我原来的功能太复杂了。有一个复杂的计算。所以,我有一个条件,如果满足这个条件,我的函数会停止。这对我来说不利于不必要的计算。因此,我试着在这里给出一个简单的例子,让我的问题清楚。我的原始函数的主要思想是进行一些计算,如果满足给定条件,则函数停止,否则它完成第二次计算。
因此,我编写了一个简单的函数,其中此函数的loop
基于特定条件。在我的功能中,我尝试执行以下操作:
这是我的尝试:
myfun <- function(x,y){
xy <- list()
n <- length(x)
for (i in 1:n){
xy[[1]] <- x[[1]]*y[[1]]
xy[[2]] <- x[[2]]*y[[2]]
if(xy[[2]] < xy[[1]]){
stop
}else{
xy[[i]] <- x[[i]]*y[[i]]
}
}
return(xy)
}
x <- rnorm(10, 0,1)
y <- rnorm(10, 0, 1)
myres <- myfun(x, y)
我的功能问题是条件只适用于第一个和第二个元素。我想执行3
列出的步骤。
请帮忙吗?
答案 0 :(得分:2)
尝试写出所有这些条件将是缓慢而痛苦的。您可以创建产品向量,并一次评估其差异是正面还是负面,然后在条件成立时返回产品(如评论中所示):
func <- function(x, y) {
xy <- x*y
d.xy <- diff(xy)
if (all(d.xy > 0)) {
xy
} else {
cat("Product", which(d.xy < 0)[1]+1, "is greater than product",
which(d.xy < 0)[1])
}
}
set.seed(8)
x <- rnorm(10, 0,1)
y <- rnorm(10, 0, 1)
func(x, y)
#> Product 3 is greater than product 2
x <- 1:10
y <- 2:11
func(x, y)
#> [1] 2 6 12 20 30 42 56 72 90 110
根据您对问题的编辑,这是一个假设计算x和y函数的成本非常耗时的版本:
## assuming time to compute vector of results is v. v. high
func2 <- function(x, y) {
cval <- x[1] * y[1]
res <- cval
for (i in 2:length(x)) {
res[i] <- x[i] * y[i]
if (res[i] < cval) {
break
}
cval <- res[i]
}
res
}
set.seed(8)
x <- rnorm(10, 0,1)
y <- rnorm(10, 0, 1)
func2(x, y)
#> [1] 0.06426797 0.24543874 -0.19531099
x <- 1:10
y <- 2:11
func2(x, y)
#> [1] 2 6 12 20 30 42 56 72 90 110
在这个函数版本中,我返回计算结果的值(而不是不返回任何内容),好像花费很长时间来计算它们可能会更好地挂起来以防它们证明有用。