检查对象是否存在于指定路径的多级列表中
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
我有一个多级列表 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