首页 > 解决方案 > 将复杂的 for 循环转换为 lapply/sapply

问题描述

需要将 for 循环转换为 lapply 以减少计算工作,但未能调整 lapply 中的所有 i 标签,因为这是一个漫长的过程

样本:


  for (i in 1:76){
    tryCatch({
      model <- nplr(x = splitlist[[i]]$dose, y = splitlist[[i]]$IC, npars = "all")
 .... computation of some variables, then 
      vdata = data.frame(splitlist[[i]]$dose, splitlist[[i]]$viability, splitlist[[i]]$IC)

进一步计算分配给 i 的变量

然后:

path = paste0(dir_path,"/results/Patient/",input$txt,"/combined_plots/",titleframe[i, ],".png", sep ="")

  } 

...ETC

标签: r

解决方案


您可以尝试编写一个执行您的操作的函数,然后lapply说函数。

前任

complicated_function <- function(df){
tryCatch({
      model <- nplr(x = df$dose, y = df$IC, npars = "all")
      ---stuff ----
      out <- stuff
}

然后你可以这样做:

outobject <- lapply(your_data, FUN = complicated_function)

我不知道这是否会让你走上正轨。如果你有一些有代表性的数据,我可以提供更多帮助,但这种方法可能对你有用。

这是一个更完整的例子

# Generate Some Fake Data
library(tidyverse)

create_random_dfs <- function(x){
  cats <- sample(LETTERS, size = 10, replace = TRUE)
  x1 <- rnorm(10, 0, 1)
  x2 <- rnorm(10, 0, 1)
  y <- 3*x1 + 1*x2
  tibble(cats, x1, x2, y)
}

df <- lapply(1:100, create_random_dfs)

# Custom Function that works for one dataframe
df[[1]]

my_function <- function(input){
  fit <- lm(y ~ x1 + x2, data = input)
  broom::tidy(fit)
}

lapply(df, my_function)

推荐阅读