如何在应用函数中转换嵌套的 for 循环

Posted

技术标签:

【中文标题】如何在应用函数中转换嵌套的 for 循环【英文标题】:How to convert the nested for loop in apply function 【发布时间】:2022-01-20 08:27:45 【问题描述】:

这里我有嵌套循环,我不知道如何将其转换为 apply 任何人都可以告诉我如何将其转换为 apply 函数

    plans_achievements <- function(pa_m,pa_q)
             if(nrow(pa_m)==0 & nrow(pa_q==0))
                df = data.frame(a = c(""), b = c("No Data Available"))
                colnames(df)=""
              else
                pa_m= pa_m%>% select(inc,month_year,Plans,Achievements,quarter_year)
                colnames(pa_mon)[2] = "Period"
        
        pa_q= pa_q%>% select(inc,quarter_year,Plans,Achievements)
        colnames(pa_qtr)[2] = "Period"
        
        df = data.frame(inc=c(""),Period=c(""),Plans=c(""),Achievements=c(""))
        
        for (q in unique(pa_q$Period))
          df1 = pa_q[pa_q$Period==q,]
          df1$Period = paste0("<span style=\"color:#288D55\">",df1$Period,"</span>")
          df1$Plans = paste0("<span style=\"color:#288D55\">",df1$Plans,"</span>")
          df1$Achievements = paste0("<span style=\"color:#288D55\">",df1$Achievements,"</span>")
          df = rbind(df,df1)
          for (m in unique(pa_m$quarter_year))
            if(m==q)
              df2 = pa_m[pa_m$quarter_year==q,][-5]
              df = rbind(df,df2)
            
          
        
        df = df[-1,]
      
    
          return(df)
        

DT::datatable(plans_achievements(pa_m[pa_m$inc=="vate",],pa_q[pa_q$inc=="vate",]), rownames = F,escape = FALSE,selection=list(mode ="single",target="row"),options = list(pageLength = 50,scrollX = TRUE,dom = 'tp',ordering=F,columnDefs = list(list(visible=FALSE,targets=c(0) ),list(className = 'dt-left', 目标 = '_all'))))

【问题讨论】:

举例说明您的输入和预期输出对您有很大帮助。从您的代码来看,它不一定是您需要的 apply 函数。 df = rbind(df,df2) 有效吗? rbind 尝试绑定不同列名的表时出现错误 @GeorgeSavva 我用示例数据和实际功能更新了代码 @JonnyPhelps 使用编辑后的代码来避免错误 【参考方案1】:

我无法想象你为什么要这样做,那么矢量化函数呢?

注意一些输入错误(pa_mon 而不是 pa_m 等)已在下面更正

plans_achievements2 <- function(pa_m,pa_q)
    if(nrow(pa_m)==0 & nrow(pa_q==0))
      df = data.frame(a = c(""), b = c("No Data Available"))
      colnames(df)=""
    else
      pa_m= pa_m%>% select(inc,month_year,Plans,Achievements,quarter_year)
      colnames(pa_m)[2] = "Period"
      
      pa_q= pa_q%>% select(inc,quarter_year,Plans,Achievements)
      colnames(pa_q)[2] = "Period"
      df <- pa_q
      df$Period <- paste0("<span style=\"color:#288D55\">",df$Period,"</span>")
      df$Plans = paste0("<span style=\"color:#288D55\">",df$Plans,"</span>")
      df$Achievements = paste0("<span style=\"color:#288D55\">",df$Achievements,"</span>")
      return(rbind(df, pa_m[pa_m$quarter_year %in% pa_q$Period,-5])[-1, ])
    
    return(df)
  

【讨论】:

For 循环在我的应用程序中执行此功能需要花费大量时间,所以只有我听说 apply 比 for 循环更快... unique(pa_q$Period) 根据值有四个值循环应该迭代 这是一个普遍存在的误解。 *apply 系列只是被美化的“for-loops”,如果正确实施循环,则不会获得任何性能。只要有可能,向量化就是要走的路,其中向量化描述了使用经过优化以接受多个输入的函数(例如paste0,它可以接受vectors 作为输入)。在上面我已经删除了for循环并利用pa_q中的所有句点都被迭代,paste0可以处理参数,同时pa_m只需要pa_q中也存在的句点,例如@ 987654329@ Bi-comment:使用*apply 函数仍然有充分的理由,因为它们可以提高函数的可读性。在这里,我将使用dfs &lt;- lapply(unique(pa_q$Period), \(x)function here) 并在调用后使用do.call(rbind, dfs) 组合结果。这永远不会是矢量化函数。 :-) 我尝试了@Oliver,但出现了一些错误,请您编辑上面的代码 没有?我已经使用了您上面的示例数据并执行了plans_achievements2(pa_m, pa_q)(注意2)。这对我来说没有错误。

以上是关于如何在应用函数中转换嵌套的 for 循环的主要内容,如果未能解决你的问题,请参考以下文章

您如何在方案中运行等效的嵌套 for 循环

如何在一个循环执行ajax方法里面嵌套的ajax方法

如何将动态XML中的嵌套标签转换为for循环?

如何在 x86 汇编语言中创建嵌套循环

您如何将其转换为迭代函数而不是使用嵌套循环进行递归?

如何在 C++ 中展开嵌套的 for 循环?