在没有 for 循环的情况下应用用户定义的函数

Posted

技术标签:

【中文标题】在没有 for 循环的情况下应用用户定义的函数【英文标题】:applying user defined function without for loop 【发布时间】:2020-06-01 00:40:31 【问题描述】:

我正在尝试使用自定义函数来解决参数的多个排列。

该函数 (yield.n) 在我调用一次时可以正常工作,例如: 产量.n(naa, F, M, S, Y) naa 是一个大型数据框 (750000 x 17),F、M 和 Y 是数字对象,S 是向量。

我想用这个函数解决 Y 的各种值。我尝试了 apply 系列的多种排列,但我无法提出函数代码。 如果我对 Y 的值(代码崩溃)运行 for 循环,它可以正确解决,但速度很慢。

yn.out <- NULL                                        
    for(yr in 50:150)                               
           yr.out <- yield.n(naa, ssf, M, S, yr)         
           yr.out <- cbind(yr.out, yr)                       
           yn.out <- rbind(yn.out, yr.out)
        

yn.out <- as.data.frame(yn.out)

我如何获得一个应用函数来解决这个问题以解决 Y 的多个值?

该函数的代码如下(但我不确定这与手头的问题是否相关)。

function(naa, F, M, S, Y)
    yr <- Y
    naa.lci <- aggregate(naa[, 1:16], list(naa$year),
                         "quantile", probs = .05)
    naa.m   <-  aggregate(naa[, 1:16], list(naa$year),
                          "quantile", probs = .5)
    naa.uci <- aggregate(naa[, 1:16], list(naa$year),
                         "quantile", probs = .9)
    yield.n.lci <- round(sum(((F*S)/(M + (F*S))) * (1- exp(-M-(F*S))) *
                             naa.lci[yr, 2:17]))
    yield.n.m   <- round(sum(((F*S)/(M + (F*S))) * (1- exp(-M-(F*S))) *
                             naa.m[yr, 2:17]))
    yield.n.uci <- round(sum(((F*S)/(M + (F*S))) * (1- exp(-M-(F*S))) *
                             naa.uci[yr, 2:17]))
    yield.out <- cbind(yield.n.lci, yield.n.m, yield.n.uci)
    return(yield.out)

【问题讨论】:

【参考方案1】:

尝试以下方法:

yn.out <- do.call(rbind, lapply(50:150, function(y) 
                  cbind(yield.n(naa, F, M, S, y), yr = y)))

或使用purrr::map_df

yn.out <- purrr::map_df(50:150, ~cbind(yield.n(naa, F, M, S, .x), yr = .x))

【讨论】:

以上是关于在没有 for 循环的情况下应用用户定义的函数的主要内容,如果未能解决你的问题,请参考以下文章

如何找到for循环中数组的长度

Pandas:自定义 WMAPE 函数聚合函数到多列而没有 for 循环?

如何在R语言中用apply等函数替代for循环

有没有办法在不使用用户定义函数的情况下在 SQL 中动态执行查询?

函数高级类型名别名if-else 的使用包的使用for循环swich的使用数组的使用

C 语言文件操作 ( 配置文件读写 | 框架搭建 | 主函数逻辑结构 | 启动无限循环 | 接收用户操作值 | 宏定义 | 显示操作菜单 )