我一直在尝试将python中的代码复制到R等价物中,但遇到了一些问题。我正在尝试向空列表添加一个向量,这在python中似乎很容易做到,但是在R中找到正确的空列表是一个挑战
我认为R等价物的问题在于为S1
确定正确的空列表,该列表的向量长度与P
和E
相同,因为python似乎没有压力。我曾尝试使用vector()
和rep()
函数并指定所需的731长度,但R不允许我对其执行任何操作,错误消息正确地显示为Error in S1[i - 1] + DS : non-numeric argument to binary operator
。在这方面,有没有一种简单的方法可以让空列表变成数字
请注意,所描绘的P
和E
对应于长度为731的外部降雨数据(来自CSV)
与python等效的代码如下所示:
A1 = float(0.134)
A2 = float(0.433)
A3 = float(0.433)
C1 = float(7)
C2 = float(70)
C3 = float(150)
S1 = []; S2 = []; S3 = []
Total_Excess = []
for i in range(1,dims[0]):
dS = P[i]-E[i]
S1_temp = max(S1[i-1]+dS,0)
S1_Excess = max(S1_temp-C1,0)
S1.append(min(S1_temp,C1))
S2_temp = max(S2[i-1]+dS,0)
S2_Excess = max(S2_temp-C2,0)
S2.append(min(S2_temp,C2))
S3_temp = max(S3[i-1]+dS,0)
S3_Excess = max(S3_temp-C3,0)
S3.append(min(S3_temp,C3))
Total_Excess.append((S1_Excess*A1)+(S2_Excess*A2)+(S3_Excess*A3))
我在卡住之前写的R代码如下所示:
A1 <- 0.4
A2 <- 0.4
A3 <- 0.2
C1 <- 10
C2 <- 75
C3 <- 200
S1 <- list()
S2 <- list()
S3 <- list()
for(i in 1:nrow(df)){
DS <- P - E
S1_temp <- max(S1[i-1]+ DS, 0)
S1_excess <- max(S1_temp - C1)
append(S1, min(S1_temp,C1))
S2_temp <- max(S2[i-1]+ DS, 0)
S2_excess <- max(S1_temp - C1)
append(S2, min(S1_temp,C1))
...
运行第一部分后,我在控制台中调用S1_temp
,只返回一个长度为1的向量,它显然应该是长度为731的向量
另外,我如何将Total_excess
空列表添加到结果向量,如python代码示例中最后一行代码所示
如蒙协助,将不胜感激
Python
S1 = []; S1.append(x)
在R中的等价物是S1 <- list(); S1 <- c(S1, list(x))
在R中在您的示例中
c(S1, x)
将起作用,因为您尝试附加的数值将自动包装在列表中,但是显式地这样做更安全。如果x
已经是一个列表,那么c(S1, x)
将把它的元素附加到S1
,而c(S1, list(x))
将把包含x
副本的单个条目附加到S1
您可以在R中使用
append()
函数,但请记住,R函数很少修改其参数,因此您可以编写在这种情况下,它基本上与
c()
相同相关问题 更多 >
编程相关推荐