在for循环中关联函数

时间:2019-04-14 21:51:51

标签: r

我正在处理一个软件包,并希望使某些函数返回非常相似的结果。我认为在for循环中分配函数名称会很麻烦,但是我没有得到期望的结果。名称每次都会更新,但该值似乎仅使用i的最后一个值。

我不确定可能会发生什么。

return_letter <- function(i){
  letters[i]
}


for(i in 1:3) {
  assign(paste0("fn_", i), function() return_letter(i))
}


fn_1() # expect "a", get "c"
fn_2() # expect "b", get "c"
fn_3() # expect "c", get "c"


rm(list = ls(pattern = "^fn_"))

对于上下文,该程序包处理颜色名称,我想返回红色,蓝色,绿色等的调色板。

1 个答案:

答案 0 :(得分:1)

一个简单的解决方案是将函数创建为字符串,然后进行解析然后求值

for(i in 1:3)
     eval(parse(text = paste0("fn_", i, " <- function()letters[", i, "]"))) #fixed mistake. Last i should be outside quotes.

但是,这似乎是处理颜色选择的一种非常低效的方法。 colourpicker程序包允许通过闪亮的小部件选择颜色。可能会发现有趣的源代码。

如果重点是存储颜色,以便在各种功能(例如,闪亮的小部件)中使用,则使用封装的环境或对象可能是更安全或更好的方法。基本上将颜色存储在列表中,因为以后会选择颜色。使用R6或S4对象(在大多数情况下,使用先验对象更简单,更直观)是这种情况下的一种解决方法。 (在这种情况下,我建议您查看并尝试?R6::R6Class中的示例。)