将代码块放在if语句中会更改分配行为R.

我遇到了一个非常奇怪的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]])
点赞