R语言 如何更新函数列表而不必创建另一个对象?

niknxzdl  于 2023-03-15  发布在  其他
关注(0)|答案(1)|浏览(188)

就像标题说的,我想更新一个函数列表,而不需要创建另一个对象。我有一个这样的代码:

add.filter <- function(filters.list, ..., after) {
  filters.list <- append(filters.list, ..., after={{after}})
  filters.list <<- filters.list
}

filters.list <- list(a = 1, b = 2, c = 3)
add.filter(filters.list, "d", after = 2)

filters.list
$a
[1] 1

$b
[1] 2

[[3]]
[1] "d"

$c
[1] 3

这工作正常,但我希望函数add.filter能够与函数列表一起工作。
例如:

filters.list <- list(function(x) replace(x, x == 3 , 300),
                     function(x) replace(x, x == "l" , 400)
                  )

如果参数是:我如何让函数add.filters()工作?

add.filter(filters.list, function(x) replace(x, x == 300 , 5000), after = 1)

我希望add.filters()的输出如下所示:

filters.list
[[1]]
function(x) replace(x, x == 3 , 300)

[[2]]
function(x) replace(x, x == 300 , 5000)

[[3]]
function(x) replace(x, x == "l" , 400)

总而言之,我想创建一个add.filters函数,它可以向现有的函数列表添加函数,而不必创建新的列表。我想用添加的新函数(filter)更新原始列表。我想让这样的东西工作:

add.filter <- function(filters.list, ..., after) {
              filters.list <- append(filters.list, ..., after={{after}})
              filters.list <<- filters.list
 }

g<-list(function(x) replace(x, x == 3 , 300),
        function(x) replace(x, x == "l" , 400)
)

add.filter(g, function(x) replace(x, x == 300 , 5000), after = 1)

g
[[1]]
function(x) replace(x, x == 3 , 300)

[[2]]
function(x) replace(x, x == "l" , 400)` 

this don't work well, so the question is how do I make the function add.filter to go for this type of list.

Thanks a lot
qv7cva1a

qv7cva1a1#

我不确定你想要实现的是不重新分配add.filter()的输出。在这种情况下,我们可以用deparse(substitute())捕获你的输入对象的名称,并在assign()中使用它。此外,你的函数应该有一个env参数,它默认为parent.frame(),但你也可以覆盖它。小心这个函数将覆盖它的输入对象。

add.filter <- function(filters.list, ..., after, env = parent.frame()) {
  obj_nm <- deparse(substitute(filters.list))
  out <- append(filters.list, ..., after = after)
  assign(obj_nm, out, envir = env)
}

filters.list <- list(a = 1, b = 2, c = 3)
add.filter(filters.list, "d", after = 2)

filters.list
#> $a
#> [1] 1
#> 
#> $b
#> [1] 2
#> 
#> [[3]]
#> [1] "d"
#> 
#> $c
#> [1] 3

创建于2023年3月13日,使用reprex v2.0.2

相关问题