在同一函数内调用在 R 中的函数内创建的分配变量
Calling an assigned variable created within a function in R, within the same function
我正在编写一个函数来解决数独难题。此函数的一部分将用于将矩阵拆分为三个 9x3 矩阵。然后,在将矩阵重新加入一个大矩阵之前,我将对每个矩阵执行操作。
对于这个阶段,我希望我的这部分功能做三件事:
- 将矩阵拆分为三个矩阵
- 为每个创建的矩阵命名
- 在同一个函数中调用新矩阵
但是,我在第 3 步中遇到了困难。我编写了一个函数,它将矩阵分成三个,为每个新矩阵命名,如果我在行 envir = globalenv()
中输入,函数会执行 return 我的矩阵分成三个 9x3 矩阵,每个矩阵都有自己的标识符名称。太棒了!
但是,我想在函数的下一部分中调用函数的第 1 步和第 2 步创建的新矩阵。在 运行 函数之前我不知道矩阵的名称,因为我希望代码可用于许多矩阵,无论大小如何。
有没有一种方法可以在 main 函数中调用由 assign 函数创建的对象,而我所知道的只是对象的名称将是 "mat_n",其中 n 是一个整数。
为清楚起见,这是我的代码的简化版本:
m <- matrix(sample(c(0:9), 81, replace = T), ncol = 9, nrow = 9)
matrix_split <- function(x){
i <- 1:length(x[, 1])
a <- 1:sum(i %% 3 == 0) # Will be used to name the temporary matrices
b <- which(i %% 3 == 0) # Will be used to identify where to split main matrix
for(n in a){ # This is to create a number of smaller matrices depending on the
# number multiples of 3 that are present in the length of the object.
nam <- paste("mat_", n, sep = "") # Each new matrix will be named and numbered
# using the assign function below:
assign(nam, x[, c((b[a[n]] - (sum(i %% 3 == 0) - 1)) : b[a[n]])])
# Not a very elegant way of using the loop to split the matrix into blocks of
# three. b[a[n]] returns either 3, 6 or 9, and (sum(i %% == 3) -1 ) = 2. So this
# will return x[, c(1:3)], x[, c(4:6)] and x[, c(7:9)], when spliting the matrix
# into three.
}
}
matrix_split(m)
我只求调用assign函数创建的对象的具体解决方案,创建后在我的main函数中使用。这将是一项有用的技能,并且是我编程知识的空白(根本不是很广泛)。
这可能也不是拆分矩阵的最佳方法,而且我知道已经创建了解决数独谜题的软件包,但我想编写自己的软件包,没有比这更好的学习方法了先做不好再改进
使用 ls
和 parent.frame
怎么样?
mat_4 <- matrix(LETTERS[1:16],nrow=4)
test <- function(){
ls(parent.frame())[grep("mat_",ls(parent.frame()))]
}
test()
# [1] "mat_4"
get(test())
# [,1] [,2] [,3] [,4]
# [1,] "A" "E" "I" "M"
# [2,] "B" "F" "J" "N"
# [3,] "C" "G" "K" "O"
# [4,] "D" "H" "L" "P"
或者如果你想包括当前环境和每一个更高的级别,有sys.frame()
。
编辑
为了避免必须知道对象的名称,也许将结果存储在列表的元素中是一个更好的计划。
matrix_split <- function(x){
i <- 1:length(x[, 1])
a <- 1:sum(i %% 3 == 0)
b <- which(i %% 3 == 0)
#initialize list
result <- list()
for(n in a){
# assign submatrix to element in the list
result[[n]] <- x[, c((b[a[n]] - (sum(i %% 3 == 0) - 1)) : b[a[n]])]
}
do.call(cbind,result)
}
matrix_split(m)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,] 6 4 2 9 1 2 8 0 4
[2,] 8 5 5 8 6 1 3 7 8
[3,] 4 7 1 8 3 6 6 0 6
[4,] 3 0 5 0 6 3 2 3 9
[5,] 0 9 7 7 0 1 5 3 2
[6,] 0 8 8 9 9 8 4 9 8
[7,] 6 0 2 9 9 2 4 8 9
[8,] 6 9 6 4 8 1 2 1 1
[9,] 8 4 6 8 5 0 9 5 9
我正在编写一个函数来解决数独难题。此函数的一部分将用于将矩阵拆分为三个 9x3 矩阵。然后,在将矩阵重新加入一个大矩阵之前,我将对每个矩阵执行操作。
对于这个阶段,我希望我的这部分功能做三件事:
- 将矩阵拆分为三个矩阵
- 为每个创建的矩阵命名
- 在同一个函数中调用新矩阵
但是,我在第 3 步中遇到了困难。我编写了一个函数,它将矩阵分成三个,为每个新矩阵命名,如果我在行 envir = globalenv()
中输入,函数会执行 return 我的矩阵分成三个 9x3 矩阵,每个矩阵都有自己的标识符名称。太棒了!
但是,我想在函数的下一部分中调用函数的第 1 步和第 2 步创建的新矩阵。在 运行 函数之前我不知道矩阵的名称,因为我希望代码可用于许多矩阵,无论大小如何。
有没有一种方法可以在 main 函数中调用由 assign 函数创建的对象,而我所知道的只是对象的名称将是 "mat_n",其中 n 是一个整数。
为清楚起见,这是我的代码的简化版本:
m <- matrix(sample(c(0:9), 81, replace = T), ncol = 9, nrow = 9)
matrix_split <- function(x){
i <- 1:length(x[, 1])
a <- 1:sum(i %% 3 == 0) # Will be used to name the temporary matrices
b <- which(i %% 3 == 0) # Will be used to identify where to split main matrix
for(n in a){ # This is to create a number of smaller matrices depending on the
# number multiples of 3 that are present in the length of the object.
nam <- paste("mat_", n, sep = "") # Each new matrix will be named and numbered
# using the assign function below:
assign(nam, x[, c((b[a[n]] - (sum(i %% 3 == 0) - 1)) : b[a[n]])])
# Not a very elegant way of using the loop to split the matrix into blocks of
# three. b[a[n]] returns either 3, 6 or 9, and (sum(i %% == 3) -1 ) = 2. So this
# will return x[, c(1:3)], x[, c(4:6)] and x[, c(7:9)], when spliting the matrix
# into three.
}
}
matrix_split(m)
我只求调用assign函数创建的对象的具体解决方案,创建后在我的main函数中使用。这将是一项有用的技能,并且是我编程知识的空白(根本不是很广泛)。
这可能也不是拆分矩阵的最佳方法,而且我知道已经创建了解决数独谜题的软件包,但我想编写自己的软件包,没有比这更好的学习方法了先做不好再改进
使用 ls
和 parent.frame
怎么样?
mat_4 <- matrix(LETTERS[1:16],nrow=4)
test <- function(){
ls(parent.frame())[grep("mat_",ls(parent.frame()))]
}
test()
# [1] "mat_4"
get(test())
# [,1] [,2] [,3] [,4]
# [1,] "A" "E" "I" "M"
# [2,] "B" "F" "J" "N"
# [3,] "C" "G" "K" "O"
# [4,] "D" "H" "L" "P"
或者如果你想包括当前环境和每一个更高的级别,有sys.frame()
。
编辑
为了避免必须知道对象的名称,也许将结果存储在列表的元素中是一个更好的计划。
matrix_split <- function(x){
i <- 1:length(x[, 1])
a <- 1:sum(i %% 3 == 0)
b <- which(i %% 3 == 0)
#initialize list
result <- list()
for(n in a){
# assign submatrix to element in the list
result[[n]] <- x[, c((b[a[n]] - (sum(i %% 3 == 0) - 1)) : b[a[n]])]
}
do.call(cbind,result)
}
matrix_split(m)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,] 6 4 2 9 1 2 8 0 4
[2,] 8 5 5 8 6 1 3 7 8
[3,] 4 7 1 8 3 6 6 0 6
[4,] 3 0 5 0 6 3 2 3 9
[5,] 0 9 7 7 0 1 5 3 2
[6,] 0 8 8 9 9 8 4 9 8
[7,] 6 0 2 9 9 2 4 8 9
[8,] 6 9 6 4 8 1 2 1 1
[9,] 8 4 6 8 5 0 9 5 9