如何使矩阵可调用函数的元素

Han*_*olo 3 r matrix

我想制作一个函数矩阵(我写的).然后以元素方式访问它们并调用.

所以,我有:func1(x),func2(y),func3(z)func4(t)那四个R的功能和我写的工作fine.They返回NUMERICS.

如果我这样做:

a_matrix <- matrix(c(a=func1,b=func2,c=func3,d=func4),2,2)
a_func<-a_matrix[1,1]
a_func(x)
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

error:attempt to call non-function.
Run Code Online (Sandbox Code Playgroud)

如果我使用列表,而不是矩阵,

a_list<-list(a=func1,b=func2,c=func3,d=func4)
a_func<-list$a
a_func(x)
Run Code Online (Sandbox Code Playgroud)

给出预期的结果

typeof(list$a)
[1] "closure" 
Run Code Online (Sandbox Code Playgroud)

如果我做 :

typeof(a_matrix)
[1] "list"
typeof(a_matrix[1,1])
[1] "list"
Run Code Online (Sandbox Code Playgroud)

(我正在使用R 3.1.1)

MrF*_*ick 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
Run Code Online (Sandbox Code Playgroud)

如果你这样做,你会得到与标准列表语法相同的结果

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
Run Code Online (Sandbox Code Playgroud)