如何在r

时间:2017-04-02 17:58:14

标签: r

我是从matlab到r的转码。我的代码在matlab中是类似c的结构。

for i = 1:m0                       
    Ent(i).connums = m0 - 1;        % number of neighbours
    Ent(i).con = [1:i-1 i+1:m0]';   % neighbour list
    Ent(i).H = [];                  
    Ent(i).L = [];                  
end 
上面代码中的

Ent是一个类似结构的数组。我试图将图形存储为相邻列表。在r中,我试图使用列表列表。比如,Ent是包含节点的列表列表。 Ent中的子列表是包含节点详细信息的列表。

我尝试了什么:

rm(list = setdiff(ls(), lsf.str()))
m0<-4
Ent <- list()

for (i in seq(1, m0))                       
{
    connums <- m0 - 1                       
    if (i + 1 > m0)                             
    {
        con <- seq(1,i-1)
    }
    else if (i - 1 < 1)
    {
        con <- c(seq(i+1,m0))
    }
    else
    {
        con <- c(seq(1,i-1), seq(i+1,m0))
    }

    H <- 0                             
    L <- 0                              
    Ent <- c(Ent, list(n=i, connums=connums, con=con, H=H, L=L))
}
Ent
is.list(Ent)
is.vector(Ent)
print(length(Ent))

for (f in Ent)
{
    print(f)
}

结果:

> Ent
$n
[1] 1

$connums
[1] 3

$con
[1] 2 3 4

$H
[1] 0

$L
[1] 0

$n
[1] 2

$connums
[1] 3

$con
[1] 1 3 4

$H
[1] 0

$L
[1] 0

$n
[1] 3

$connums
[1] 3

$con
[1] 1 2 4

$H
[1] 0

$L
[1] 0

$n
[1] 4

$connums
[1] 3

$con
[1] 1 2 3

$H
[1] 0

$L
[1] 0

> is.list(Ent)
[1] TRUE
> is.vector(Ent)
[1] TRUE
> print(length(Ent))
[1] 20
> for (f in Ent)
+ {
+ print(f)
+ }
[1] 1
[1] 3
[1] 2 3 4
[1] 0
[1] 0
[1] 2
[1] 3
[1] 1 3 4
[1] 0
[1] 0
[1] 3
[1] 3
[1] 1 2 4
[1] 0
[1] 0
[1] 4
[1] 3
[1] 1 2 3
[1] 0
[1] 0

为什么Ent的长度为20?该列表似乎是未列出的。我的预期结果可能是列表中的子列表。子列表Ent的长度应为4.我已阅读此solution,但仍无法找到我的解决方案。是否有可能在r中存储c类似的结构?怎么做?任何替代方案?

1 个答案:

答案 0 :(得分:1)

由于Ent <- c(Ent, list(n=i, connums=connums, con=con, H=H, L=L)),列表的长度为20。在这里,您将列表连接到上一个列表。您不会将列表的特定元素连接到彼此。因此,如果Ent的长度为0,则会添加5。这种情况发生了4次(因为length(seq(1, m0)) = 4),而4 * 5 = 20.如果你想追加Ent中的特定元素,你可以尝试:

Ent$H = c(Ent$H, ...) # replace ... with values to append
Ent$L = c(Ent$L, ...)