为什么我的for循环只能工作一半? (R)

时间:2019-04-09 15:45:56

标签: r loops na

我不确定如何为我的问题制作一个可复制的示例,并且这篇文章非常冗长。我希望这个问题可能会出现。基本上,此for循环从外部程序获取输出,在R中进行一些计算,然后将这些计算的结果发布回外部文件中。

循环的第一次迭代运行得很好。它会正确执行所有操作,然后继续返回循环顶部并更改到正确的目录(flist[2]),但是当它到达第二个函数(get_stress_table)时,它会通过打印“ NA”而阻塞而不是文件名(flist,它是文件名的向量)。

在此循环中循环访问的文件名和子目录共享一个公用名。它正确地更改为setwd中正确的子目录,但是在第一个函数中将“ NA”打印为文件名这一事实使我感到困惑。因此,我不明白问题所在。

有什么突出吗?

这是我要运行的for循环:

for (i in 1:length(flist)){

  setwd(paste0(solutions_dir, "\\", flist[i])) 

  max_stress <- get_stress_table(solutions_dir = solutions_dir, flist = flist[i], lsdynadir = lsdynadir, states = 5)
  xy_table <- element_time_series(stressed_eid = max_stress, solutions_dir = solutions_dir, flist = flist[i], lsdynadir = lsdynadir) 
  damp_coeff <- find_damp(xy_table = file_xy)
  setwd(kfile_complete)
  erode_damp(erosion_lines = erosion_lines, damp_coef = damp_coeff, kfile_mesh = flist[i])

}

这是我返回的错误:

3.
file(con, "r") 
2.
readLines(flist[i]) 
1.
get_stress_table(solutions_dir = solutions_dir, flist = flist[i], 
    lsdynadir = lsdynadir, states = 5)

这是该函数的内部:

  biggest_stresses <- data.frame(eid= numeric(),
                                 stress = numeric(),
                                 stringsAsFactors=FALSE) 

  for (j in 1:states) {
    fileconn <- file("get_stresses.cfile")
    line_one <- paste0("open d3plot ", solutions_dir, "\\", flist[i], "\\", "d3plot")
    line_two <- "ac"
    line_three <- "fringe 14"
    line_four <- "pfringe"
    line_five <- "anim forward"
    line_six <- "anim stop; state 100;"
    line_seven <- paste0("output ", solutions_dir, "\\", flist[i], "\\", flist[i], " ", j, " 1 1 1 0 0 0 0 1 0 0 0 0 0 0 1.000000")
    writeLines(c(line_one, line_two, line_three, line_four, line_five, line_six, line_seven), fileconn)
    close(fileconn)
    system(paste0(lsdynadir,"\\lsprepost4.3_x64.exe c=get_stresses.cfile -nographics"))


    stresses <- readLines(flist[i])
    start <- grep(stresses, pattern="*KEYWORD",fixed = T)
    stop <- grep(stresses, pattern="$Interpreted from averaged nodal data",fixed = T)
    stresses <- stresses[-seq(start, stop, by = 1)]
    writeLines(stresses, flist[i])
    stresses <- read.table(flist[i], header = FALSE)
    names(stresses) <- c("eid", "stress")
    max_stress <- which(stresses$eid == which.max(stresses$stress)

    biggest_stresses <- rbind(biggest_stresses, stresses[max_stress,]

  }

  return(biggest_stresses[which.max(biggest_stresses$stress),1])

}

0 个答案:

没有答案