存储嵌套循环的未知长度结果

Store unknown length results of a nested loop

我有一个嵌套循环:

SA_range <- seq(0.01, 89.99, by = 0.01)
SR_value <- c(0.182, 0.307, 0.408, 0.603, 0.720, 0.823, 0.998)

library(tidyverse)
library(pracma)

for (i in SR_value) {
  for (j in SA_range) {
    if (near((cot(j*(pi/180))*log(tan(j*(pi/180)) + sec(j*(pi/180)))), # my formula
             i, 
             tol = 0.0002)) {
      print(c(i, j))
    } 
  }
}

我在这里尝试做的是将 SA_range 中的每个数字代入公式,以查看公式输出是否与 SR_value 中的值匹配,以及输出是否匹配 [=12] =] 以给定的精度 (0.0002),然后在 SA_range.

中打印 SR_value 和相应的值

循环工作正常,但我的问题是存储结果(目前我只能打印它们)。挑战是我的实际 SR_value 比这个例子有更多的值,有时 SA_range 中的多个值可以通过循环找到。例如当SR = 0.182时,只有一个SA值匹配公式输出,但是当SR = 0.998时,有63个SA值匹配输出! (此处未显示代码以保存space)

所以基本上,假设这个循环的结果长度是未知的,我怎样才能存储所有的结果?

(这是一个迭代求解方程的案例,欢迎使用其他有效的方法!)

针对您的用例的解决方案:

results <- list()
for (i in SR_value) {
  SAresults <- numeric()
  for (j in SA_range) {
    if (near((cot(j*(pi/180))*log(tan(j*(pi/180)) + sec(j*(pi/180)))), # my formula
         i, 
         tol = 0.0002)) {
      SAresults <- c(SAresults, j)
    } 
  results[[as.character(i)]] <- SAresults  
  }
}
 

建议解决方案的最小可重现示例:

SA_range <- seq(0.01, 89.99, by = 0.01)
SR_value <- c(0.182, 0.307, 0.408, 0.603, 0.720, 0.823, 0.998)


results <- list()
for (i in SR_value) {
  SAresults <- numeric()
  for (j in SA_range) {
    if (j < 0.03) {
      SAresults <- c(SAresults, j)
    } 
  results[[as.character(i)]] <- SAresults  
  }
}

results

Returns:

$`0.182`
[1] 0.01 0.02

$`0.307`
[1] 0.01 0.02

$`0.408`
[1] 0.01 0.02

$`0.603`
[1] 0.01 0.02

$`0.72`
[1] 0.01 0.02

$`0.823`
[1] 0.01 0.02

$`0.998`
[1] 0.01 0.02

你可以试试-

SA_range <- seq(0.01, 89.99, by = 0.01)
SR_value <- c(0.182, 0.307, 0.408, 0.603, 0.720, 0.823, 0.998)

library(tidyverse)
library(pracma)
results <- list()
k <- 0
for (i in SR_value) {
  for (j in SA_range) {
    value <- (cot(j*(pi/180))*log(tan(j*(pi/180)) + sec(j*(pi/180))))
    if (near(value, i, tol = 0.0002)) {
      k <- k + 1
      results[[k]] <- c(i, j)
    } 
  }
}
results

#[[1]]
#[1]  0.182 87.190

#[[2]]
#[1]  0.307 84.080

#[[3]]
#[1]  0.307 84.090

#[[4]]
#[1]  0.408 80.800

#[[5]]
#[1]  0.408 80.810
#...