在数据帧中保存R中嵌套循环的值

在数据帧中保存R中嵌套循环的值,r,R,伙计们,我可能是小题大做,但我在R上遇到了一些问题。我想做的是:用循环来解决x1和x2上多重权重的线性规划问题。循环和函数工作得很好,但我无法将数据存储在向量中,这令人沮丧。注:我是R方面的新手 library(lpSolve) # Set up problem to maximize # a1*x1 + a2*x2 # subject to # x1 + x2 <= 500 # 8x1 - 9x2 = 0 #Creating the constraint matrix f.con

伙计们,我可能是小题大做,但我在R上遇到了一些问题。我想做的是:用循环来解决x1和x2上多重权重的线性规划问题。循环和函数工作得很好,但我无法将数据存储在向量中,这令人沮丧。注:我是R方面的新手

library(lpSolve)
# Set up problem to maximize
# a1*x1 + a2*x2  
# subject to
# x1 + x2 <= 500
# 8x1 - 9x2 = 0


#Creating the constraint matrix
f.con <- matrix (c(1, 1, 8, -9), nrow=2, byrow=TRUE)

#Creating the vector for operators
f.dir <- c("<=", "=")

#Creating the Right hand side of the constraints in the above problem. 
f.rhs <- c(500, 0)
#
# Now run the program
#

#Create vector to store maximized objective values
ans <- vector('numeric')


#Create loop sequences for a1 and a2
a1 <- seq(0.1,1,0.1)
a2 <- seq(0.1,1,0.1)

#Run for lop with lp function
for(i in a1){
  for(j in a2){
      if(i+j)==1{
      ans[i] <- lp("max", c(i,j), f.con, f.dir, f.rhs)$objval
    }  
  }
}
库(lpSolve)
#设置问题以最大化
#a1*x1+a2*x2
#服从

#x1+x2看起来if语句的结尾括号应该在“1”附近,而不是“j”附近。比如:


看起来if语句的结尾括号应该围绕“1”而不是“j”。比如:


您的代码有以下几点:

  • 正如@MillionC指出的,您的条件语句在语法上是错误的,它应该有更多的封闭paren,如
    if((i+j)==1){…

  • 第一次调用
    lp(…)
    时,它被分配给
    ans[0.1]
    ,这是毫无意义的,您可能需要迭代
    a1
    (以及可选的
    a2
    )的索引


  • 您对
    ans
    的预分配不一定是错误的,但除非您告诉它它的大小,否则预分配的作用很小;我建议
    ans您的代码有以下几点:

    • 正如@MillionC指出的,您的条件语句在语法上是错误的,它应该有更多的封闭paren,如
      if((i+j)==1){…

    • 第一次调用
      lp(…)
      时,它被分配给
      ans[0.1]
      ,这是毫无意义的,您可能需要迭代
      a1
      (以及可选的
      a2
      )的索引


    • 您对
      ans
      的预分配不一定是错误的,但除非您告诉它的大小,否则预分配的作用很小;我建议
      ans在最后一个大括号“}->my_-vec”处结束它@ElioDiaz,你能让它像那样返回向量吗?最后我检查了一下,你能期望的最好结果是上一条语句的返回值(这肯定不是全部).
      ans@r2evans它成功了。太棒了!但是因为我不熟悉apply函数族,你能指出我的代码有什么问题吗!必须有一种使用嵌套循环的方法。如果你运行代码,你会看到在第一次调用
      lp()
      时,你正试图将它分配到
      ans[0.1]
      ,这是没有意义的。你可能已经能够为(ind in seq_-along(i))执行
      ,并像在最后一个大括号“}->my_-vec”@ElioDiaz那样结束它,你能让它返回这样的向量吗?最后我检查了一下,您所能期望的最好结果是上一条语句的返回值(这肯定不是全部)。完美的但是由于我不熟悉apply函数族,您能指出我的代码有什么问题吗!必须有一种使用嵌套循环的方法。如果您运行代码,您将看到在第一次调用
      lp()
      时,您试图将其分配到
      ans[0.1]
      ,这是毫无意义的。您可能已经能够为(ind in seq_-along(i))ans[ind]执行
      ,这当然是一个问题,很好的发现,但它并没有解决预期的问题。你自己试过代码吗?这只是我在这里写的代码的一个输入错误。很抱歉。这确实是个问题,很好的发现,但它并没有解决预期的问题。你自己试过代码吗?这只是我在这里写的代码的一个输入错误。很抱歉。
      
      if(i+j==1){
      
      ans <- vector('numeric', length(a1))
      for (indi in seq_along(a1)) {
        for (indj in seq_along(a2)) {
          if ((a1[indi]+a2[indj]) == 1) {
            ans[indi] <- 99 + a1[indi]
          }  
        }
      }
      ans
      #  [1] 99.1 99.2 99.3 99.4 99.5 99.6 99.7 99.8 99.9  0.0
      
      ans <- vector('numeric', length(a1))
      for (indi in seq_along(a1)) {
        ans[indi] <- 99 + a1[indi]
      }
      ans
      #  [1]  99.1  99.2  99.3  99.4  99.5  99.6  99.7  99.8  99.9 100.0
      
      vec <- 1:10
      for (ind in seq_along(vec)) vec[ind] <- vec^2
      
      vec <- 1:10
      vec <- vec^2
      
      ans <- sapply(seq_along(a1), function(indi) 99 + a1[indi])
      ans
      #  [1]  99.1  99.2  99.3  99.4  99.5  99.6  99.7  99.8  99.9 100.0
      
      ans <- sapply(seq_along(a1), function(indi) {
        sapply(seq_along(a2), function(indj) {
          if ((a1[indi]+a2[indj]) == 1) {
            99 + a1[indi]
          } else {
            # something here?
          }
        })
      })
      ans
      #       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
      #  [1,] NULL NULL NULL NULL NULL NULL NULL NULL 99.9 NULL 
      #  [2,] NULL NULL NULL NULL NULL NULL NULL 99.8 NULL NULL 
      #  [3,] NULL NULL NULL NULL NULL NULL 99.7 NULL NULL NULL 
      #  [4,] NULL NULL NULL NULL NULL 99.6 NULL NULL NULL NULL 
      #  [5,] NULL NULL NULL NULL 99.5 NULL NULL NULL NULL NULL 
      #  [6,] NULL NULL NULL 99.4 NULL NULL NULL NULL NULL NULL 
      #  [7,] NULL NULL 99.3 NULL NULL NULL NULL NULL NULL NULL 
      #  [8,] NULL 99.2 NULL NULL NULL NULL NULL NULL NULL NULL 
      #  [9,] 99.1 NULL NULL NULL NULL NULL NULL NULL NULL NULL 
      # [10,] NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 
      
      myfunc <- function(i, j) lp("max", c(i,j), f.con, f.dir, f.rhs)$objval
      ans <- mapply(myfunc, a1, a2)
      
      myfunc(i[1], j[1])
      myfunc(i[2], j[2])
      myfunc(i[3], j[3])
      ...
      myfunc(i[10], j[10])
      
      mapply(function(w,x,y,z) { ... },
             list(...), list(...), list(...), list(...))