提问人:Troy 提问时间:7/12/2021 最后编辑:Troy 更新时间:7/15/2021 访问量:37
如何根据存储在 tibble 中的数据执行未知数量的函数调用/“管道”?
How to execute an unknown amount of function calls/"pipes" based upon data stored within a tibble?
问:
我将尝试使此示例尽可能可重现和明确。
要完全重现代码,您需要以下软件包...
library(tidyverse)
library(ompr)
library(ompr.roi)
library(ROI)
library(ROI.plugin.glpk)
而且,您需要创建以下“虚拟”数据集......
dummy_data <-
tibble(
category = c("A01", "A01", "A01", "A01", "A05", "A05", "A05", "A15", "A15", "A15", "A15"),
unknown = c("w", "b", "c", "l", "w", "b", "c", "w", "b", "c", "o"),
known = c(388610, 7760, 94970, 129931, 366472, 360477, 82212, 128021, 114379, 72185, 32807),
known_sum = c(1470189, 1470189, 1470189, 1470189, 1110194, 1110194, 1110194, 831287, 831287, 831287, 831287)
)
我的目标是使用 OMPR 包(混合线性规划)根据方程和一些边界/约束来反求一组未知因素,这些边界/约束依赖于存储在“dummy_data”字块中的数据。我设法快速使用 OMPR 包来获得以下示例,通过从虚拟数据中“手动输入”所有必要的信息来工作。下面是仅第一类 (A01) 的示例...
model <-
MILPModel() %>%
add_variable(w, lb = 1.8, ub = 2.8, type = "continuous") %>%
add_variable(b, lb = 2.0, ub = 3.0, type = "continuous") %>%
add_variable(c, lb = 1.1, ub = 1.8, type = "continuous") %>%
add_variable(l, lb = 1.3, ub = 1.7, type = "continuous") %>%
set_objective(388610*w+ 7760*b+ 94970*c+ 129931*l, "min") %>%
add_constraint((388610*w+ 7760*b+ 94970*c+ 129931*l) == 1470189) %>%
solve_model(with_ROI(solver = "glpk"))
现在,目标是为每个“类别”(即 A05、A15 和任何其他潜在的 Axx)创建一个相同的模型,而不仅仅是如上所示的 A01。我可以轻松创建“model2”和“model3”,然后手动输入所有数字。删除 A05 的“l”变量,然后在 A15 中添加一个新的“o”变量(具有自己的特定边界)。
然而,这感觉并不整洁,它是大量的手工工作,而且随着类别/变量数量的增加,它很快就会变得越来越不可持续。
有没有一种整洁的方法来逐步执行虚拟数据集(可能使用“类别”上的group_map),其中映射函数创建一个不同的模型(如上面手动演示的那样),但对于每个类别 - 基于模型参数基于数据集中每个类别中存在的唯一变量/数字集?
- 仅创建为该类别显示的变量(即 A01 的 w、b、c、l;A05 的 w、b、c;A15 的 w、b、c、o)
- 在set_objective和add_constraint调用中归属正确的“已知”号码。
- 将正确的“known_sum”号码归因于add_constraint呼叫的结束 (RHS)。
我用 rlang/metaprogramming 标记了这个问题,因为在我看来,我正在朝着“使用代码创建代码”的方向发展来解决这个问题(使用 quo、eval 等)。然而,我在 R 编程的那部分完全天真/没有经验,我看好可能有一种更简单的方法来解决这个问题,使用更少的手动(和更整洁)的方法!
感谢您提前向我提出的任何想法/帮助!
干杯 特洛伊
答: 暂无答案
评论