如何将名称不为 NULL 的列表传递给 r 中 do.call 的参数
How to pass a list whose names is not NULL to the arguments of do.call in r
当我尝试传递名称不为 NULL 的列表时,我在评估 do.call 时收到以下错误:错误:缺少参数“x”,没有默认值。是否有另一种方法可以绕过列表的名称并访问列表中的实际元素而不将名称设置为 NULL?
# with NULL names, do.call runs
num_list <- list(1:10)
do.call(mean,num_list)
# without names being NULL, do.call fails
names(num_list) <- 'a'
do.call(mean,num_list)
具体来说,我想将列表传递给函数的省略号,例如 raster::merge、https://www.rdocumentation.org/packages/raster/versions/3.3-7/topics/merge.
library(rgdal)
library(sf)
library(raster)
cities <- sf::st_read(system.file("vectors/cities.shp", package = "rgdal"))
birds <- sf::st_read(system.file("vectors/trin_inca_pl03.shp", package = "rgdal"))
sf_shapes <- list(cities, birds)
# without names works
sf_shape_extents = lapply(sf_shapes, raster::extent)
sf_max <- do.call(what = raster::merge, args = sf_shape_extents)
# with names does not
names(sf_shapes) <- c('cities', 'birds')
sf_shape_extents_names = lapply(sf_shapes, raster::extent)
sf_max_names <- do.call(what = raster::merge, args = sf_shape_extents)
您要么确保传入的列表的名称与函数的参数相对应,要么确保列表未命名且列表元素的位置与相关参数的位置相对应。
names(num_list) <- 'x'
do.call(mean,num_list)
[1] 5.5
names(num_list) <- 'a'
do.call(mean,unname(num_list))
[1] 5.5
编辑:
我没有看到您编辑的版本有任何结构上的变化。错误是因为名称,因为它们与函数的命名参数不对应。您正在传递命名参数,这将引发错误。
您需要问自己的问题是 您打算使用的函数的参数名称是什么?
如果函数的省略号接受未命名的参数,那么传入的参数是否命名都没有关系。例如,R 中的 paste
函数:
a <- list(a="a",b=3,c="d");
do.call(paste,a)
[1] "a 3 d"
当我尝试传递名称不为 NULL 的列表时,我在评估 do.call 时收到以下错误:错误:缺少参数“x”,没有默认值。是否有另一种方法可以绕过列表的名称并访问列表中的实际元素而不将名称设置为 NULL?
# with NULL names, do.call runs
num_list <- list(1:10)
do.call(mean,num_list)
# without names being NULL, do.call fails
names(num_list) <- 'a'
do.call(mean,num_list)
具体来说,我想将列表传递给函数的省略号,例如 raster::merge、https://www.rdocumentation.org/packages/raster/versions/3.3-7/topics/merge.
library(rgdal)
library(sf)
library(raster)
cities <- sf::st_read(system.file("vectors/cities.shp", package = "rgdal"))
birds <- sf::st_read(system.file("vectors/trin_inca_pl03.shp", package = "rgdal"))
sf_shapes <- list(cities, birds)
# without names works
sf_shape_extents = lapply(sf_shapes, raster::extent)
sf_max <- do.call(what = raster::merge, args = sf_shape_extents)
# with names does not
names(sf_shapes) <- c('cities', 'birds')
sf_shape_extents_names = lapply(sf_shapes, raster::extent)
sf_max_names <- do.call(what = raster::merge, args = sf_shape_extents)
您要么确保传入的列表的名称与函数的参数相对应,要么确保列表未命名且列表元素的位置与相关参数的位置相对应。
names(num_list) <- 'x'
do.call(mean,num_list)
[1] 5.5
names(num_list) <- 'a'
do.call(mean,unname(num_list))
[1] 5.5
编辑:
我没有看到您编辑的版本有任何结构上的变化。错误是因为名称,因为它们与函数的命名参数不对应。您正在传递命名参数,这将引发错误。
您需要问自己的问题是 您打算使用的函数的参数名称是什么?
如果函数的省略号接受未命名的参数,那么传入的参数是否命名都没有关系。例如,R 中的 paste
函数:
a <- list(a="a",b=3,c="d");
do.call(paste,a)
[1] "a 3 d"