我想制作一个函数矩阵(我写的)。然后以元素方式访问它们并调用。
所以我有:func1(x)
,func2(y)
,func3(z)
和func4(t)
这四个R函数我写得很好。他们返回数字。
现在,如果我这样做:
a_matrix <- matrix(c(a=func1,b=func2,c=func3,d=func4),2,2)
a_func<-a_matrix[1,1]
a_func(x)
我收到以下错误:
error:attempt to call non-function.
如果我使用列表,则代替矩阵,
a_list<-list(a=func1,b=func2,c=func3,d=func4)
a_func<-list$a
a_func(x)
给出预期结果
typeof(list$a)
[1] "closure"
如果我这样做:
typeof(a_matrix)
[1] "list"
typeof(a_matrix[1,1])
[1] "list"
(我正在使用R 3.1.1)
答案 0 :(得分:6)
当你创建这样的非原子矩阵时,它们基本上被制作成花哨的列表。在索引方面,类似的规则适用于常规列表;即[ ]
将始终返回另一个列表,[[ ]]
将提取没有列表包装器的元素。你真的想要
func1 <- function(x) x+1
func2 <- function(x) x+2
func3 <- function(x) x+3
func4 <- function(x) x+4
a_matrix <- matrix(c(a=func1,b=func2,c=func3,d=func4),2,2)
a_func <- a_matrix[[1,1]]
a_func(5)
# [1] 6
如果你做了
,你的标准列表语法会得到相同的结果a_list <- list(a=func1,b=func2,c=func3,d=func4)
a_func <- a_list["a"]
a_func(5)
# Error: could not find function "a_func"
a_func <- a_list[["a"]]
a_func(5)
# [1] 6