R 使用存储的变量动态创建函数列表?

R 使用存储的变量动态创建函数列表?,r,tidyr,R,Tidyr,嗨,我喜欢动态创建函数列表。唯一的问题是,我已经存储了我喜欢作为函数输入的变量。例如,假设我有一个带颜色的命名向量 color = c("blue","red") names ( color) = c("a","b") 现在我想创建一个返回颜色的动态函数列表 c = list() for ( n in names ( color)){ c[[n]]= function ( x){ return ( color[n]) } } 但是,正如您所看到的,它返回的是

嗨,我喜欢动态创建函数列表。唯一的问题是,我已经存储了我喜欢作为函数输入的变量。例如,假设我有一个带颜色的命名向量

color = c("blue","red")
names ( color) = c("a","b")
现在我想创建一个返回颜色的动态函数列表

c = list()

for ( n in names ( color)){
    c[[n]]= function ( x){
        return ( color[n])
    }
}
但是,正如您所看到的,它返回的是颜色[n],而不是计算值

> c$a
function ( x){
        return ( color[n])
    }
<bytecode: 0x0000000105e0a108>
这个答案使用了evalpasse…构造,它有其缺陷。但你可以试试:

for (n in names(color)) {
  c[[n]] <- eval(parse(text = sprintf("function(x) return(color['%s'])", n)))
}

c
# $`a`
# function (x) 
# return(color["a"])

# $b
# function (x) 
# return(color["b"])

c$a()
#      a 
# "blue" 
但是,正如你的问题的评论者和其他地方的评论者所建议的那样,根据你的上下文和用例,可能会有更优雅的解决方案。

这个答案使用了evalpasse…结构,它有它的缺陷。但你可以试试:

for (n in names(color)) {
  c[[n]] <- eval(parse(text = sprintf("function(x) return(color['%s'])", n)))
}

c
# $`a`
# function (x) 
# return(color["a"])

# $b
# function (x) 
# return(color["b"])

c$a()
#      a 
# "blue" 
但是,正如对您的问题和其他地方的评论所建议的,根据您的上下文和用例,可能会有更优雅的解决方案

根据上面的答案,我意识到你想要一个函数,在这个函数中你可能想要传递更多的参数

下面是带有evalexpr语句的代码。它可能比上面的答案可读性更好,但实际上并没有什么不同

c = list()
for ( n in names (color)){
  c[[n]]= eval(expr(function(x) {return(color[(!!n)])}))
}
编辑

根据上面的答案,我意识到你想要一个函数,在这个函数中你可能想要传递更多的参数

下面是带有evalexpr语句的代码。它可能比上面的答案可读性更好,但实际上并没有什么不同

c = list()
for ( n in names (color)){
  c[[n]]= eval(expr(function(x) {return(color[(!!n)])}))
}

试着这样做:

颜色=蓝色,红色 名称颜色=ca,b c=列表 n的颜色名称{ 评估 作语法分析 文本=粘贴0 c[[n]]=函数x{ 返回',颜色[n],' } } 加元一个 >函数x{ >返回“蓝色” > }
由v0.3.0于2020年3月4日创建,请尝试以下操作:

颜色=蓝色,红色 名称颜色=ca,b c=列表 n的颜色名称{ 评估 作语法分析 文本=粘贴0 c[[n]]=函数x{ 返回',颜色[n],' } } 加元一个 >函数x{ >返回“蓝色” > } 由v0.3.0于2020年3月4日创建,以下是一种方法:

c = list()
for ( n in names ( color)) {
  c[[n]] <- (function(n) {
    force(n)
    function (x) return ( color[n])
  })(n)
}
或者用map替换for循环更容易`

这里有一个方法:

c = list()
for ( n in names ( color)) {
  c[[n]] <- (function(n) {
    force(n)
    function (x) return ( color[n])
  })(n)
}
或者用map替换for循环更容易`


你的最终目标是什么?把颜色的名字写进一个列表?as.listnamescolor将实现这一点。@JonnyPhelps不,这只是一个例子。我需要创建特定于每一轮循环的函数。颜色只是我想到的一个例子。使用c$a?返回红色。什么原因?我正在努力思考一个实际的用例,因为你通常可以通过生成一个函数,然后在变量集上循环函数来实现这些结果,例如使用lappy@m.Papenberg是的,但它只是在全局环境中寻找颜色。更改颜色[2]=hi,c[[2]]现在将返回hi。您的最终目标是什么?把颜色的名字写进一个列表?as.listnamescolor将实现这一点。@JonnyPhelps不,这只是一个例子。我需要创建特定于每一轮循环的函数。颜色只是我想到的一个例子。使用c$a?返回红色。什么原因?我正在努力思考一个实际的用例,因为你通常可以通过生成一个函数,然后在变量集上循环函数来实现这些结果,例如使用lappy@m.Papenberg是的,但它只是在全局环境中寻找颜色。更改颜色[2]=hi,此时c[[2]]将返回hi。