首页 > 解决方案 > R:存储要由函数返回的变量内容,如果重新分配对象,则该函数不会更改

问题描述

我需要创建一个函数来返回存储为变量的一段数据。但是,此变量稍后将被重新分配。如何指定一个函数来返回变量的当前内容(不为其分配唯一变量),而不是在执行函数时调用该变量?

v <- mtcars[["mpg"]]

v
#>  [1] 21.0 21.0 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 17.8 16.4 17.3 15.2 10.4
#> [16] 10.4 14.7 32.4 30.4 33.9 21.5 15.5 15.2 13.3 19.2 27.3 26.0 30.4 15.8 19.7
#> [31] 15.0 21.4

f <- function(x) v  # I would like to here specify "the content of v" and not v the variable

# Because otherwise, if v gets re-assigned...
v <- 3

# the function pulls the new variable (which is expected, but is not what I need)
f()
#> [1] 3

reprex 包(v1.0.0)于 2021-06-08 创建

例如,我尝试过:f <- function(x) eval(v)希望它是存储在函数中的“内容”,但它不起作用。

部分解决方案及后续问题

虽然@Waldi 的答案在我给出的示例中有效,但我忘了补充一点,为了让事情变得更糟,我实际上需要将此函数存储在一个列表中(我不制定规则哈哈),这违反了建议双函数解决方案,因为列表中的对象返回一个函数而不是变量的内容:

v <- mtcars$mpg
f <- function(x) function() x
thelist <- list("specific_name" =  f(v))

thelist[["specific_name"]]
#> function() x
#> <environment: 0x000000001419c068>

reprex 包(v1.0.0)于 2021-06-08 创建

请注意,调用列表中的对象thelist$specific_name()thelist[["specific_name"]]()工作,但在我的情况下不是一个选项(因为将函数列表作为输入的包不调用函数,而只是“正常”检索它们 [没有()] 并期望值) .

标签: rfunctionvariablesenvironment-variables

解决方案


您可以创建一个函数,该函数返回一个存储当前值的函数:

v <- mtcars$mpg
f <- function(x) function() x
g <- f(v)
g()
#>  [1] 21.0 21.0 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 17.8 16.4 17.3 15.2 10.4
#> [16] 10.4 14.7 32.4 30.4 33.9 21.5 15.5 15.2 13.3 19.2 27.3 26.0 30.4 15.8 19.7
#> [31] 15.0 21.4
v <- 3
g()
#>  [1] 21.0 21.0 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 17.8 16.4 17.3 15.2 10.4
#> [16] 10.4 14.7 32.4 30.4 33.9 21.5 15.5 15.2 13.3 19.2 27.3 26.0 30.4 15.8 19.7
#> [31] 15.0 21.4

推荐阅读