在数据帧中保存R中嵌套循环的值
伙计们,我可能是小题大做,但我在R上遇到了一些问题。我想做的是:用循环来解决x1和x2上多重权重的线性规划问题。循环和函数工作得很好,但我无法将数据存储在向量中,这令人沮丧。注:我是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
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(...))