我遇到了一个非常奇怪的R问题.我在if语句中有一大块代码来分配列表元素,但无论它是在if语句中运行(即使if语句是if(1 == 1){…})还是在if语句之外,它都会有不同的反应.
基本上,代码应该只是if(true){Raw [[1]] $params = params [[1]];原料[[2]] $PARAMS =参数[[2]];等..但是,最后,Raw [[1]] $params == Raw [[2]] $params和Raw [[3]] $params == Raw [[4]] $params,但仅限如果它在if(true){}语句中.如果它不在if语句中,它可以正常工作.
让我举个例子(这是原始代码的一个大大简化的版本;代表和列表分配的动机是出于与问题无关的可变管理原因):
#----- Create variables
# params is a 4-element list
params0 <- list(runif(2),runif(4),runif(6),runif(8))
# Raw is a 2-element list, of which every element is another (named) list
Raw0 <- list(list(data=runif(3),params=runif(2)),
list(data=runif(6),params=runif(6)))
dothing <- TRUE
#----- With if statement - does not correctly assign
Raw <- Raw0
params <- params0
if (dothing) {
Raw <- rep(Raw,each=2)
for (x in seq(1,length(params))) {
Raw[[x]]$params <- params[[x]]
}
}
# This should be false since params[[1]] ~= params[[2]], but returns true
identical(Raw[[1]],Raw[[2]])
#----- Without if statement - does correctly assign
Raw <- Raw0
params <- params0
Raw <- rep(Raw,each=2)
for (x in seq(1,length(params))) {
Raw[[x]]$params <- params[[x]]
}
# This returns false as expected
identical(Raw[[1]],Raw[[2]])
所有这一切中最后一个非常奇怪的皱纹 – 在原始代码中,如果代码是按块运行(不丢失任何行),则分配工作正常,但如果整个代码一次运行则无法正确分配.
有人能告诉我我在这里缺少什么吗?预先感谢您的帮助!
最佳答案 观察到的行为与if循环无关.
如果您指定不同的结构,它将发出警告“要替换的项目数不是替换长度的倍数”.
我不认为它确实 – 在你的情况下 – 使用$访问原始内容并替换为params的内容.
> str(Raw[[1]]$params)
num [1:2] 0.925 0.393
> str(params[[1]])
num [1:2] 0.177 0.986
#returns the content
> str(Raw[[1]]$params) #Used in your eg
num [1:2] 0.949 0.143
> str(Raw[[1]][[2]]) #Equivalent to the one used in your eg
num [1:2] 0.949 0.143
#returns the type of list
> str(Raw[[1]]["params"])
List of 1
$params: num [1:2] 0.949 0.143
不同之处是Raw [[1]] [“params”]返回一个列表,而Raw [[1]] $params或Raw [[1]] [[2]]返回内容.
但实际上,当相同大小和类型的列表被替换为另一个列表(这是替换长度的正确倍数)时,这将起作用.
更新的代码:
#----- Create variables
# params is a 4-element list
params0 <- list(runif(2),runif(4),runif(6),runif(8))
# Raw is a 2-element list, of which every element is another (named) list
Raw0 <- list(list(data=runif(3),params=runif(2)),
list(data=runif(6),params=runif(6)))
dothing <- TRUE
#----- With if statement - does not correctly assign
Raw <- Raw0
params <- params0
if (dothing) {
Raw <- rep(Raw,each=2)
for (x in seq(1,length(params))) {
Raw[[x]]["params"] <- params[x] ##Note the way list is returned and list is replaced for another list.
}
}
#CORRECTED returns false: This should be false since params[[1]] ~= params[[2]], but returns true
identical(Raw[[1]],Raw[[2]])