make_empty_graph(n = 0,directed = direct)中的错误:VECTOR_ELT()只能应用于“列表”,而不是“闭包”

问题描述 投票:0回答:1

作为本学期我正在进行的研究的一部分,我正在添加一个由以前的学生已经构建的网络,但我遇到了以前从未遇到过的错误。这段代码不是我写的,我只是在前进过程中稍微修改了一下。

所以我有这个列表

daily_networks_df
,其中包含 85953 个数据框,每个数据框看起来像这样:

enter image description here

这里的函数和代码生成网络的不同部分(家庭、工作和其他):

generate_el <- function(net_df){
    networki = net_df[,1]
    if(length(networki)>1){
    # add edge in all possible pairs with prob_interact[i]
        prob_interact=1/sqrt(length(networki))
        ppl_pairs = combn(networki, 2)
        tmp1 = rbinom(ncol(ppl_pairs), 1, prob_interact)
        el_tmp = t(ppl_pairs[,tmp1==1])
        return(el_tmp)
    }
}

上面的这个函数针对 3 种不同的网络类型进行了一些修改,但其他 2 种非常相似,所以我没有包括在内。这是函数调用:

# DEMAND NETWORK
work_start = 2
list_el1 = lapply(daily_networks_df[1:work_start], generate_el)
gr_el1 = do.call('rbind', list_el1)

# WORK NETWORK
prob_interact = .4
list_el2 = lapply(daily_networks_df[(work_start+1):homes_start], generate_el_work)
gr_el2 = do.call('rbind', list_el2)

# HOME NETWORK
prob_interact = .8
list_el3 = lapply(daily_networks_df[(homes_start+1):length(daily_networks_df)], generate_el_homes)
gr_el3 = do.call('rbind', list_el3)

# FULL NETWORK
gr_el=rbind(gr_el1, gr_el2, gr_el3)
gr = graph_from_data_frame(gr_el, directed=FALSE, vertices=total_pop)

当我尝试执行但不知道为什么时出现此错误。有什么帮助吗?

> gr = graph_from_data_frame(gr_el, directed=FALSE, vertices=total_pop)

Error in make_empty_graph(n = 0, directed = directed) : 
  VECTOR_ELT() can only be applied to a 'list', not a 'closure'
r igraph
1个回答
0
投票

这是一个老问题,但根据我在将列格式化为列表时遇到的类似错误,解决方案很可能只是更改列的数据类型。

如果

df
是一个 data.frame 或一个 tibble,并且
x1
是一个造成麻烦的列,

df$x1 <- as.character(df$x1)

查看修改后问题是否仍然存在。

(如果需要将其格式化为数字,可以使用

as.numeric()
。重点是重新分类它,这样它就不是“闭包”。)

© www.soinside.com 2019 - 2024. All rights reserved.