检查对象是否存在于指定路径的多级列表中

Check if object exists in multi-level list at specified path

我有一个多级列表 l,其中包含任意数量的级别和条目。举个简单的例子:

l <- list(a = 1,
          b = list(x = 2, y = 3),
          c = list(dog = 5, cat = list(fish = 3, mouse = 10))
         )

在我的包中,用户传递了一个“地址”,它指定了此列表中的一个对象。地址作为字符串传递,格式为:

address = "$c$cat$fish"

这不包括列表本身的名称。

我编写了一个函数来检查地址是否“有效”,也就是说我想检查指定地址是否存在对象。函数的主要内容如下:

# this is the call to evaluate, as a string
expr_str <- paste0("address_value <- l", address)

# evaluate the call
eval(str2lang(expr_str))

if(is.null(address_value)){
   warning("Address is NULL or not found in list")
}

现在,这行得通了(尽管可能有更优雅的方法来做到这一点)。但问题是我在 CMD 检查中得到一个注释,因为 address_value 没有可见的绑定,因为它是在 eval().

中创建的

我想摆脱笔记,但我不确定如何在不使用 eval() 的情况下检索 address 中存在(或不存在)的任何内容。

谁能帮忙解决这个问题?

您是否考虑过使用 purrr::pluck?我认为它符合您的要求:

l %>% pluck('c', 'cat', 'fish')
[1] 3

address_value的赋值可以在eval外部,这样就避免了CMD检查中未声明的变量nag。

check_address <- function(address) {
  
  expr_str <- paste0("l", address)
  
  # evaluate the call
  address_value <- eval(str2lang(expr_str))
  
  if(is.null(address_value)){
    warning("Address is NULL or not found in list")
  }
  
  address_value
}

这导致:

check_address("$c$cat$fish")
#> [1] 3

check_address("$c$cat$banana")
#> NULL
#> Warning message:
#> In check_address("$c$cat$banana") : Address is NULL or not found in list