在 for 循环中命名对象

Name objects in for loop

提问人:Valentina 提问时间:9/26/2023 更新时间:9/26/2023 访问量:48

问:

我有这个循环来处理(校正)一些光谱数据:for

names_list <- ls(pattern="s+\\d") # the names of the uncorrected spectra are s01, s02, s02 etc...
c <- mget(ls(pattern="s+\\d"))

for (file in c) {
  
  process <- process_spec(file,
               active = TRUE,
               adj_intens = FALSE,
               adj_intens_args = list(type = "none"),
              conform_spec = TRUE,
              conform_spec_args = list(range = FTIR_lib$wavenumber, res = 5, type = "interp"),
              etc...)
  
  names <- paste0("corr_", names_list)
  
  assign(names, process, envir = .GlobalEnv) # OPTION 1 
  list2env(as.list(setNames(names, process)), envir = .GlobalEnv) # OPTION 2 
  
}

我想将这个校正函数()在一个循环中应用于我所有的光谱(s01、s02、s03等),并将全球环境中这些校正的物体命名为:corr_s01、corr_s02等......process_spec()

选项 1 不起作用。

选项 2 创建“值”,而不是对象。

未校正的光谱对象示例:

str(s01)
List of 3
 $ wavenumber: num [1:7468] 400 401 401 402 402 ...
 $ spectra   :Classes ‘data.table’ and 'data.frame':    7468 obs. of  1 variable:
  ..$ intensity: num [1:7468] 0.46 0.453 0.446 0.442 0.438 ...
  ..- attr(*, ".internal.selfref")=<externalptr> 
 $ metadata  :Classes ‘data.table’ and 'data.frame':    1 obs. of  5 variables:
  ..$ x        : int 1
  ..$ y        : int 1
  ..$ file_name: chr "s01"
  ..$ file_id  : chr "Nahal_Rahaf_2"
  ..$ col_id   : chr "intensity"
  ..- attr(*, ".internal.selfref")=<externalptr> 
 - attr(*, "class")= chr [1:2] "OpenSpecy" "list"

谢谢

R 循环 对象

评论

0赞 MrFlick 9/26/2023
如果包含一个简单的可重现示例,其中包含可用于测试和验证可能的解决方案的示例输入和所需输出,则更容易为您提供帮助。它看起来根本不像你在循环中子集,所以它没有办法知道要使用哪个名称,而且每次迭代都会使用相同的值。此外,一般来说,它通常更容易避免创建单独的变量,而只是收集命名列表中的所有内容,你可以比循环更容易地创建names_listlapply
0赞 Valentina 9/26/2023
我不能使用,因为这是一个列表并且只接受 OpenSpecy 对象,这就是我使用 .name_listprocess_spec()c
2赞 Konrad Rudolph 9/26/2023
@PaulStaffordAllen 我认为这个货物崇拜的建议。名称冲突是不可避免的,并且可以处理(例如,通过尽可能限制名称的范围,无论如何这是很好的做法)。命名一个对象——如果这个名字在上下文中有意义的话——不是一个问题,不应该被劝阻。c
2赞 PGSA 9/26/2023
公平 - 对于那些知道自己在做什么的人来说,它并不害怕,但我仍然认为避免使用这些名字是一个好习惯,除非,正如你所说,它们在特定情况下是有意义的。
1赞 MrFlick 9/26/2023
@Valentina我并不是要暗示这是解决方案,但我试图帮助您了解问题所在。如果要循环访问对象值,则无法访问其名称。相反,如果循环访问名称,则可以在该循环的每次迭代中从该名称获取值。但同样,这在 R 中通常是一种低效的策略。最好将相关值保留在列表中,并将转换应用于该列表。

答:

3赞 Señor O 9/26/2023 #1

在 R 中,按照特定模式(如 corr_sN)创建一堆命名的全局变量通常不是一个好主意,而只是使用列表。

corrList = lapply(c, function(file) process_spec(file, ...))

将 替换为 的所有参数。...process_spec

然后,这些对象将可以通过索引访问corrList[[i]]

评论

0赞 Konrad Rudolph 9/26/2023
您不需要在此处使用匿名函数,允许直接内联指定更多参数:.唉,这是否比插入匿名函数更具可读性,这有点主观。lapplylapply(c, process_spec, …)
0赞 Señor O 9/26/2023
@KonradRudolph 我很懒,并且以这种方式完成参数名称的选项卡代码 8)
0赞 Konrad Rudolph 9/26/2023
老实说,这不是一个坏理由。R的未来版本(以及周围的工具)可能会在这方面做得更好,因为目前正在讨论的语言中增加了一个新的内容。