使用 paste() 后如何 keep/change class
How to keep/change the class after using paste()
我正在使用 netCDF 文件并遇到以下问题:
我创建了 70 个“ncdf4”对象 class。它们被命名为 ncin1950 - ncin2019。
在下一步中,我需要从单个对象中提取某些信息(所谓的“consecutive_dry_days_index_per_time_period”),这是通过以下命令定期完成的,以 ncin1950 为例:
cdd.array1950 <- ncvar_get(ncin1950,"consecutive_dry_days_index_per_time_period")
这很好用。
由于我不想对每个对象应用此命令,因此我不想对每个对象应用此命令 70 次,因此我尝试使用循环:
for (i in 1950:2019) {
assign(paste0("cdd.array",i), ncvar_get(paste("ncin",i,sep = ""),"consecutive_dry_days_index_per_time_period"))
}
由于以下原因,这没有用:
error in ncvar_get(paste("ncin", i, sep = ""), "consecutive_dry_days_index_per_time_period") :
first argument (nc) is not of class ncdf4!
我认为这是因为 paste() 会自动创建 class“字符”的结果:
> class(paste("ncin",1950,sep = ""))
[1] "character"
而
> class(ncin1950)
[1] "ncdf4"
所以问题是,如何在使用 paste() 函数或任何类似的连接函数时将“ncdf4”class 保留在 for 循环中?
您需要 get()
才能使用字符串引用对象,ncvar_get(get(paste("ncin",i,sep = ""))
。或者使用 mget()
一次获取整个对象列表,然后 lapply()
.
或者,最重要的是,重新安排您的上游工作流,以便您创建对象的 列表,而不是让您的工作区充满 70 个不同的对象。然后您可以使用 for
循环或 lapply
或更高级的方法(例如 purrr::map()
)对列表进行操作。这更符合惯用语,并且会在长期 运行 ...
中简化您的生活
我正在使用 netCDF 文件并遇到以下问题:
我创建了 70 个“ncdf4”对象 class。它们被命名为 ncin1950 - ncin2019。 在下一步中,我需要从单个对象中提取某些信息(所谓的“consecutive_dry_days_index_per_time_period”),这是通过以下命令定期完成的,以 ncin1950 为例:
cdd.array1950 <- ncvar_get(ncin1950,"consecutive_dry_days_index_per_time_period")
这很好用。
由于我不想对每个对象应用此命令,因此我不想对每个对象应用此命令 70 次,因此我尝试使用循环:
for (i in 1950:2019) {
assign(paste0("cdd.array",i), ncvar_get(paste("ncin",i,sep = ""),"consecutive_dry_days_index_per_time_period"))
}
由于以下原因,这没有用:
error in ncvar_get(paste("ncin", i, sep = ""), "consecutive_dry_days_index_per_time_period") :
first argument (nc) is not of class ncdf4!
我认为这是因为 paste() 会自动创建 class“字符”的结果:
> class(paste("ncin",1950,sep = ""))
[1] "character"
而
> class(ncin1950)
[1] "ncdf4"
所以问题是,如何在使用 paste() 函数或任何类似的连接函数时将“ncdf4”class 保留在 for 循环中?
您需要 get()
才能使用字符串引用对象,ncvar_get(get(paste("ncin",i,sep = ""))
。或者使用 mget()
一次获取整个对象列表,然后 lapply()
.
或者,最重要的是,重新安排您的上游工作流,以便您创建对象的 列表,而不是让您的工作区充满 70 个不同的对象。然后您可以使用 for
循环或 lapply
或更高级的方法(例如 purrr::map()
)对列表进行操作。这更符合惯用语,并且会在长期 运行 ...