我想制作一个函数矩阵(我写的).然后以元素方式访问它们并调用.
所以,我有: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)
当你创建这样的非原子矩阵时,它们基本上被制成花哨的列表.在索引方面,类似的规则适用于常规列表; 即[ ]总是返回另一个列表,并且[[ ]]将提取的元素无单包装.你真的想要
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)