我是R的新手,我使用R(西北角法)编码运输问题如下。每次我运行R脚本给我
Error in if (requir[y] > supply[x]) { :
missing value where TRUE/FALSE needed
In addition: Warning message:
In unit[x][y] = supply[x] :
number of items to replace is not a multiple of replacement length
错误消息和警告消息。请帮我调试代码。
#cost data
cost=matrix(c(6,11,16,9,10,12,16,7,10),nrow=3,ncol=3)
#matrix to store amount flow between destinations
unit=matrix(c(0,0,0,0,0,0,0,0,0),nrow=3,ncol=3)
supply=c(200,200,200)
requir=c(150,200,250)
cost_minimum=0
x=1
y=1
while(x<4 & y<4){
if(requir[y]>supply[x]){
unit[x][y]=supply[x]
requir[y]=requir[y]-unit[x][y]
supply[x]=supply[x]-unit[x][y]
cost_minimum=cost_minimum+unit[x][y]*cost[x][y]
x=x+1
}
if(requir[y]<supply[x]){
unit[x][y]=requir[y]
requir[y]=requir[y]-unit[x][y]
supply[x]=supply[x]-unit[x][y]
cost_minimum=cost_minimum+unit[x][y]*cost[x][y]
y=y+1
}
if(requir[y]==supply[x]){
unit[x][y]=requir[y]
requir[y]=requir[y]-unit[x][y]
supply[x]=supply[x]-unit[x][y]
cost_minimum=cost_minimum+unit[x][y]*cost[x][y]
y=y+1
x=x+1
}
}
答案 0 :(得分:2)
首先,Stack Overflow不是一般的代码调试服务。您应该询问一个特定的编程问题,并提供一个最小的示例,清楚地重新创建并演示您所面临的问题。你显然还没有发现错误。
但是你的问题与任何流量算法无关;你只是有基本的语法和逻辑问题。你正在索引matirixes错误
#wrong
unit[x][y]
#right
unit[x, y]
其次,在if
条件中,您可以增加x
或y
。然后,在同一循环中的后续if
语句中,您将查找那些现在可能超出范围1-3的新值。看起来您应该将它们设置为if/else
块,这样您就不会走到数组的末尾。例如
while(x<4 & y<4){
if(requir[y]>supply[x]){
...
x=x+1
} else if(requir[y]<supply[x]){
...
y=y+1
} else if(requir[y]==supply[x]){
...
y=y+1
x=x+1
}
}
答案 1 :(得分:0)
数据框不是矩阵。如果unit
是数据框,则可以unit[[x]][y]
代替unit[x, y]
。这是因为数据帧实际上只是列表,其中数据框中的每一列都是列表的一个元素。因此,您可以使用它们上的列表语法来访问列。但是,矩阵不是列表。在内部,它们是按列“堆叠”的原子向量(“原子”基本上意味着“您无法访问具有$
运算符的元素”)。因此,矩阵a <- matrix(100:103, nrow = 2)
与c(1, 2, 3, 4)
一起存储,并附带特殊维度属性。要自己查看此内容,请键入dput(matrix(100:103, nrow = 2))
,并记下属性.Dim
。因此a[3]
和a[1,2]
都会返回102
。
请注意,即使unit
是数据框,unit[x][y]
仍然会给您错误的信息。 [
和[[
不是同义词。有几个不同之处,但最重要的是它们在列表中调用时会返回不同的内容。 [
将返回一个列表,在这种情况下长度为1,其元素是向量。 [[
返回向量本身。要帮助理解差异,请尝试以下代码:
data(iris) # "Iris" is one of R's built-in data sets.
sprintf("class of iris[1]: %s\nclass of iris[[1]]: %s\n",
class(iris[1]), class(iris[[1]]))
sprintf("length of iris[1]: %s\nlength of iris[[1]]: %s\n",
length(iris[1]), length(iris[[1]]))
对于作业:如果在矩阵上调用[[
会发生什么?为什么与在数据框上调用[[
不同?