当我尝试传递名称不为 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)
Run Code Online (Sandbox Code Playgroud)
具体来说,我想将列表传递给函数的省略号,例如 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)
Run Code Online (Sandbox Code Playgroud)
您可以确保传入的列表的名称与函数的参数相对应,或者该列表未命名并且列表元素的位置与相关参数的位置相对应。
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
Run Code Online (Sandbox Code Playgroud)
编辑:
我在您编辑的版本中没有看到任何结构变化。该错误是由于名称造成的,因为它们与函数的命名参数不对应。您正在传递命名参数,这将引发错误。您需要问自己的问题是您打算使用的函数的参数名称是什么?
如果函数的省略号接受未命名的参数,那么传入的参数是否命名都没有关系。例如,pasteR 中的函数:
a <- list(a="a",b=3,c="d");
do.call(paste,a)
[1] "a 3 d"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
438 次 |
| 最近记录: |