R:列表内部向量和外部向量之间的操作
我有一个由3个元素组成的列表,每个元素是由2个其他元素组成的列表。第一个是四维向量,第二个是字符。下面的代码将生成一个与我刚才描述的完全相同的列表:R:列表内部向量和外部向量之间的操作,r,list,vector,R,List,Vector,我有一个由3个元素组成的列表,每个元素是由2个其他元素组成的列表。第一个是四维向量,第二个是字符。下面的代码将生成一个与我刚才描述的完全相同的列表: x <- NULL for(i in 1:3){ set.seed(i); a <- list(sample(1:4, 4, replace = T), LETTERS[i]) x <- c(x, list(a)) } 现在,我有另一个四维向量,比如说y: y <- 1:4 问题:如何以简单优雅的方式创建上述矩阵
x <- NULL
for(i in 1:3){
set.seed(i); a <- list(sample(1:4, 4, replace = T), LETTERS[i])
x <- c(x, list(a))
}
现在,我有另一个四维向量,比如说y
:
y <- 1:4
问题:如何以简单优雅的方式创建上述矩阵?我正在寻找一些解决方案,可以使用一些apply
函数,或者可以以某种我不知道的方式直接使用sum
函数。尝试以下方法:
# you can also simply write: sapply(x, function(x) x[[1]]) + y
foo <- function(x) x[[1]]
sapply(x, foo) + y
虽然我的原始答案更容易理解,但它并不是最有效的,因为对于每个列表元素,调用两个函数调用来提取向量。而如果我们直接使用'[['
,则只调用一个函数调用。因此,我们可以通过减少函数调用开销来节省时间。当函数很小且不做太多工作时,函数调用开销是显而易见的
R中的运算符本质上是函数。+
,*
等都是算术运算符,你可以通过?'+'
找到它们。同样,你也可以找到?'[[['
。如果你现在不能理解,不要太担心。迟早你会找到它的
更新2 我不明白它实际上是如何工作的。当我在控制台简单地请求[[1]]时,我得到的是列表的第一个元素(整数向量和字符值),而不仅仅是向量。我想剩下的应该是
sapply
函数的魔法
啊,如果你在理解<代码> sPiest(或者类似的代码> LePix<代码>)时遇到困难,请考虑下面的内容,但我将从<代码> LePix< /Cord>开始。
output@Zheyuan我想在循环内部(而不是外部)设置种子没有好处。仅供参考,您不需要编写完整的函数定义sapply(x,`[`,1)
works@Zheyuan:谢谢你给出这样一个完整的答案。它工作得非常完美。虽然我理解它的工作原理-正如你所说,函数foo
提取列表中的向量-但我不理解它实际上是如何工作的。当我在控制台上简单地要求[[1]]
时,我得到了列表的第一个元素(整数向量和字符值),不仅仅是向量。我想剩下的应该是sapply
函数的魔法。我会接受你的答案。谢谢。@zheiyunli是的,我现在了解了引擎盖下发生的事情,并且使用sapply
和lappy
感到更加自信。非常努力,回答非常好!
[,1] [,2] [,3]
[1,] 3 2 2
[2,] 4 5 6
[3,] 6 6 5
[4,] 8 5 6
# you can also simply write: sapply(x, function(x) x[[1]]) + y
foo <- function(x) x[[1]]
sapply(x, foo) + y
a <- 1:4
a[2] # 2
'[['(a, 2) # 2
output <- vector("list", length = length(x))
for (i in 1:length(x)) output[[i]] <- foo(x[[i]])
> output
[[1]]
[1] 2 2 3 4
[[2]]
[1] 1 4 4 3
[[3]]
[1] 3 1 1 1