添加顶点(’type’)参数到igraph对象列表中

huangapple go评论79阅读模式
英文:

Adding vertices ('type') aurguments to list of igraph objects

问题

我有一个包含植物-传粉者相互作用的边缘列表的列表,用于多个双分图网络。我正在尝试使用 igraph R包将这些列表转换为双分图关联矩阵以进行分析。

我在尝试将顶点(igraph::V)添加到列表 graph_list 中的igraph对象时遇到了问题。请注意:我希望避免使用 for 循环解决方案,因为我的完整数据集是包含238个网络的列表,包含80,000多条边。

我提供一个可重现的数据示例:

  1. network_list <- replicate(10, expr = {
  2. data.frame(plant = paste('plnt', '_', sample(x = letters, size = 10, replace = T), sep = ""),
  3. pollinator = paste('pollinator', '_', sample(x = letters, size = 10, replace = T), sep = ""))
  4. }, simplify = F)
  5. library(tidyverse)
  6. library(dplyr)
  7. library(igraph)

我尝试将顶点序列添加到列表中的每个图中。但以下代码不按我期望的方式工作:

  1. graph_list <- lapply(network_list, graph_from_data_frame) #从边缘列表创建igraph对象的列表
  2. list_mapping <- lapply(graph_list, bipartite.mapping) #将网络映射为双分图
  3. list_type <- lapply(list_mapping, with, type) #提取每个网络的顶点列表
  4. graph_list <- mapply(c, graph_list, list_type) #尝试将顶点添加到graph_list
  5. incidence_list <- lapply(graph_list, get.incidence) #出错

get.incidence 期望带有 types 参数的双分图 graph 对象。

作为参考,我正在遵循适用于单个网络的代码,该代码有效:

  1. example_network <- network_list[[1]] #选择一个示例网络
  2. net_graph <- graph_from_data_frame(example_network) #将边缘列表转换为图
  3. bipartite.mapping(net_graph) #创建双分图
  4. 输出:
  5. $res
  6. [1] TRUE
  7. $type
  8. [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
  9. V(net_graph)$type <- bipartite.mapping(net_graph)$type #计算顶点('type')并将其添加为图的向量
  10. incidence_matrix <- get.incidence(net_graph) #生成关联矩阵
  11. incidence_matrix[incidence_matrix > 1] <- 1 #强制0/1边,某些行在随机列表中重复出现导致值大于1

我的期望是列表中每个关联矩阵的格式如下:

  1. poll_z poll_g poll_h poll_d poll_r poll_i poll_l poll_x
  2. plnt_v 1 0 0 0 0 0 0 0
  3. plnt_o 0 1 0 0 0 0 0 0
  4. plnt_r 0 0 1 0 1 0 0 0
  5. plnt_c 0 0 0 1 0 0 0 0
  6. plnt_x 0 0 0 1 0 0 0 0
  7. plnt_a 0 0 0 0 0 1 1 0
  8. plnt_j 0 0 0 0 0 0 1 0
  9. plnt_h 0 0 0 0 0 0 0 1

此外,强制将列表中的所有可能重复值(即值大于1的值)设置为1将非常有帮助。

英文:

I have a list of lists containing the edgelists of plant-pollinator interactions, for a number bipartite networks. Using the igraph r-package I am attempting to convert these lists into bipartite incidence matrices for analysis.

I am having trouble adding vertices (igraph::V) to the igraph objects in the list graph_list. Note: I would prefer to avoid for loop solutions as my complete dataset is a list of 238 networks comprising >80k edges.

Reproducable example of my data.

  1. network_list &lt;- replicate(10, expr = {data.frame(plant = paste(&#39;plnt&#39;, &#39;_&#39;, sample(x = letters, size = 10, replace = T), sep = &quot;&quot;),pollinator = paste(&#39;pollinator&#39;, &#39;_&#39;, sample(x = letters, size = 10, replace = T), sep = &quot;&quot;))}, simplify = F)
  2. library(tidyverse)
  3. library(dplyr)
  4. library(igraph)

I am trying to add the vertex sequence to each graph in the list. But the following code is not working as I am expecting.

  1. graph_list &lt;- lapply(network_list, graph_from_data_frame) #creates list of igraph objects from list of edgelists
  2. list_mapping &lt;- lapply(graph_list, bipartite.mapping) #map networks as bipartit
  3. list_type&lt;- lapply(list_mapping, with, type) #extract list of vertices for each network
  4. graph_list &lt;- mapply(c, graph_list, list_type) #ATTEMPT to add vertices to graph_list
  5. incidence_list &lt;- lapply(graph_list, get.incidence) #breaks
  6. `Error in FUN(X[[i]], ...) : Not a graph object

get.incidence is expecting bipartite graph objects with types argument supplied.

For reference, I am following code which works for a single network.

  1. example_network &lt;- network_list[[1]] #select one network for example
  2. net_graph &lt;- graph_from_data_frame(example_network) #take the edge list and make it into a graph
  3. bipartite.mapping(net_graph) #make bipartite graph
  4. OUTPUT:
  5. $res
  6. [1] TRUE
  7. $type
  8. [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
  9. V(net_graph)$type &lt;- bipartite.mapping(net_graph)$type #compute vertices (&#39;type&#39;) and add as vector to graph
  10. incidence_matrix &lt;- get.incidence(net_graph) #produce incidence matrix
  11. incidence_matrix[incidence_matrix &gt; 1] &lt;- 1 #force 0/1 edge, some rows are duplicated in random list resulting in values &gt;1

where my desired format of each incidence matrix in the list is:

<pre> poll_z poll_g poll_h poll_d poll_r poll_i poll_l poll_x
plnt_v 1 0 0 0 0 0 0 0
plnt_o 0 1 0 0 0 0 0 0
plnt_r 0 0 1 0 1 0 0 0
plnt_c 0 0 0 1 0 0 0 0
plnt_x 0 0 0 1 0 0 0 0
plnt_a 0 0 0 0 0 1 1 0
plnt_j 0 0 0 0 0 0 1 0
plnt_h 0 0 0 0 0 0 0 1</pre>

Also it would be a great help to have all possible duplicate values (i.e. values &gt;1) in the list of matrices forced to equal 1.

答案1

得分: 2

  1. 你的 `mapply` 调用使用 `c` 是不正确的。你可以编写自己的小型 lambda 函数,例如 `function(g, type) { V(g)$type <- type; return(g) }` 直接放在 `mapply` 内部,虽然也有 igraph 函数 `vertex_attr<-` 可以直接实现相同的功能。
  2. 我倾向于使用 `Map` 而不是 `mapply`,因为它本质上是相同的函数,但它从不尝试像 `mapply` 那样“简化”输出,这可能导致意外的结果。(`Map(...)` `mapply(..., SIMPLIFY = FALSE)` 完全相同,但键入更少)。
  3. 最后,要将矩阵的列表转换为 0 保持为 0,所有正数变为 1,我们可以使用 `lapply(incidence_list, sign)`
  4. 所以你的整个代码可能是这样的:
  5. ``` r
  6. library(tidyverse)
  7. library(igraph)
  8. graph_list <- lapply(network_list, graph_from_data_frame)
  9. list_mapping <- lapply(graph_list, bipartite.mapping)
  10. list_type <- lapply(list_mapping, with, type)
  11. graph_list <- Map(`vertex_attr<-`, graph_list, "type", value = list_type)
  12. incidence_list <- lapply(graph_list, get.incidence)
  13. incidence_list <- lapply(incidence_list, sign)

而你的结果将会是:

  1. incidence_list
  2. #> [[1]]
  3. #> pollinator_z pollinator_h pollinator_a pollinator_c pollinator_x
  4. #> plnt_m 1 0 0 0 0
  5. #> plnt_k 0 1 1 0 1
  6. #> plnt_l 0 0 0 1 0
  7. #> plnt_c 0 0 0 0 0
  8. #> plnt_y 0 0 0 0 0
  9. #> plnt_u 1 0 0 0 0
  10. #> pollinator_b pollinator_n pollinator_l pollinator_i
  11. #> plnt_m 0 0 1 1
  12. #> plnt_k 0 0 0 0
  13. #> plnt_l 0 0 0 0
  14. #> plnt_c 1 0 0 0
  15. #> plnt_y 0 1 0 0
  16. #> plnt_u 0 0 0 0
  17. #>
  18. #> [[2]]
  19. #> pollinator_j pollinator_t pollinator_o pollinator_s pollinator_l
  20. #> plnt_e 1 0 0 0 0
  21. #> plnt_t 0 1 0 0 0
  22. #> plnt_j 0 0 1 0 0
  23. #> plnt_v 0 0 0 1 0
  24. #> plnt_o 0 0 1 0 1
  25. #> plnt_p 0 0 0 0 0
  26. #> plnt_b 0 0 0 0 0
  27. #> plnt_u 0 0 0 0 0
  28. #> pollinator_c pollinator_r pollinator_f
  29. #> plnt_e 0 1 0
  30. #> plnt_t 0 0 0
  31. #> plnt_j 0 0 0
  32. #> plnt_v 0 0 0
  33. #> plnt_o 0 0 0
  34. #> plnt_p 1 0 0
  35. #> plnt_b 0 1 0
  36. #> plnt_u 0 0 1
  37. #>
  38. #> [[3]]
  39. #> pollinator_k pollinator_u pollinator_x pollinator_g pollinator_o
  40. #> plnt_a 1 0 0 0 0
  41. #> plnt_e 0 1 0 0 0
  42. #> plnt_u 0 0 1 0 0
  43. #> plnt_w 0 0 0 1 0
  44. #> plnt_i 0 0 0 0 1
  45. #> plnt_d 0 0 0 0 0
  46. #> plnt_r 0 0 0 0 0
  47. #> plnt_h 0 0 0 0 0
  48. #> pollinator_s pollinator_e pollinator_h
  49. #> plnt_a 0 0 1
  50. #> plnt_e 0 0 0
  51. #> plnt_u 0 0 0
  52. #> plnt_w 0 0 0
  53. #> plnt_i 0 0 0
  54. #> plnt_d 1 0 0
  55. #> plnt_r 0 1 0
  56. #> plnt_h 1 0 0
  57. #>
  58. #> [[4]]
  59. #> pollinator_r pollinator_i pollinator_l pollinator_m pollinator_z
  60. #> plnt_n 1 0 0 0 0
  61. #> plnt_d 0 1 0 0 0
  62. #> plnt_g 0 0 1 0 0
  63. #> plnt_v 0 0 0 1 0
  64. #> plnt_y 0 0 0 0 1
  65. #> plnt_l 0 0 0 0 0
  66. #> plnt_r 0 0 0 0 0
  67. #> plnt_j 0 0 0 0 0
  68. #> pollinator_k pollinator_o pollinator_c pollinator_j pollinator_x
  69. #> plnt_n 0 0 0 0 0
  70. <details>
  71. <summary>英文:</summary>
  72. You `mapply` call using `c` isn&#39;t correct. You could write your own little lambda function such as `function(g, type) { V(g)$type &lt;- type; return(g) }` directly inside `mapply`, though there is also the igraph function `vertex_attr&lt;-` which can do the same thing directly.
  73. I tend to use `Map` rather than `mapply`, because it is essentially the same function but never attempts to &quot;simplify&quot; the output the way `mapply` does, which can lead to unexpected results. (`Map(...)` is identical to `mapply(..., SIMPLIFY = FALSE)` but requires fewer keystrokes).
  74. At the end, to convert the list of matrices such that 0s remain 0s and all positive numbers become 1, we can do `lapply(incidence_list, sign)`
  75. So your whole code might be something like this:
  76. ``` r
  77. library(tidyverse)
  78. library(igraph)
  79. graph_list &lt;- lapply(network_list, graph_from_data_frame)
  80. list_mapping &lt;- lapply(graph_list, bipartite.mapping)
  81. list_type &lt;- lapply(list_mapping, with, type)
  82. graph_list &lt;- Map(`vertex_attr&lt;-`, graph_list, &quot;type&quot;, value = list_type)
  83. incidence_list &lt;- lapply(graph_list, get.incidence)
  84. incidence_list &lt;- lapply(incidence_list, sign)

And your result would be:

  1. incidence_list
  2. #&gt; [[1]]
  3. #&gt; pollinator_z pollinator_h pollinator_a pollinator_c pollinator_x
  4. #&gt; plnt_m 1 0 0 0 0
  5. #&gt; plnt_k 0 1 1 0 1
  6. #&gt; plnt_l 0 0 0 1 0
  7. #&gt; plnt_c 0 0 0 0 0
  8. #&gt; plnt_y 0 0 0 0 0
  9. #&gt; plnt_u 1 0 0 0 0
  10. #&gt; pollinator_b pollinator_n pollinator_l pollinator_i
  11. #&gt; plnt_m 0 0 1 1
  12. #&gt; plnt_k 0 0 0 0
  13. #&gt; plnt_l 0 0 0 0
  14. #&gt; plnt_c 1 0 0 0
  15. #&gt; plnt_y 0 1 0 0
  16. #&gt; plnt_u 0 0 0 0
  17. #&gt;
  18. #&gt; [[2]]
  19. #&gt; pollinator_j pollinator_t pollinator_o pollinator_s pollinator_l
  20. #&gt; plnt_e 1 0 0 0 0
  21. #&gt; plnt_t 0 1 0 0 0
  22. #&gt; plnt_j 0 0 1 0 0
  23. #&gt; plnt_v 0 0 0 1 0
  24. #&gt; plnt_o 0 0 1 0 1
  25. #&gt; plnt_p 0 0 0 0 0
  26. #&gt; plnt_b 0 0 0 0 0
  27. #&gt; plnt_u 0 0 0 0 0
  28. #&gt; pollinator_c pollinator_r pollinator_f
  29. #&gt; plnt_e 0 1 0
  30. #&gt; plnt_t 0 0 0
  31. #&gt; plnt_j 0 0 0
  32. #&gt; plnt_v 0 0 0
  33. #&gt; plnt_o 0 0 0
  34. #&gt; plnt_p 1 0 0
  35. #&gt; plnt_b 0 1 0
  36. #&gt; plnt_u 0 0 1
  37. #&gt;
  38. #&gt; [[3]]
  39. #&gt; pollinator_k pollinator_u pollinator_x pollinator_g pollinator_o
  40. #&gt; plnt_a 1 0 0 0 0
  41. #&gt; plnt_e 0 1 0 0 0
  42. #&gt; plnt_u 0 0 1 0 0
  43. #&gt; plnt_w 0 0 0 1 0
  44. #&gt; plnt_i 0 0 0 0 1
  45. #&gt; plnt_d 0 0 0 0 0
  46. #&gt; plnt_r 0 0 0 0 0
  47. #&gt; plnt_h 0 0 0 0 0
  48. #&gt; pollinator_s pollinator_e pollinator_h
  49. #&gt; plnt_a 0 0 1
  50. #&gt; plnt_e 0 0 0
  51. #&gt; plnt_u 0 0 0
  52. #&gt; plnt_w 0 0 0
  53. #&gt; plnt_i 0 0 0
  54. #&gt; plnt_d 1 0 0
  55. #&gt; plnt_r 0 1 0
  56. #&gt; plnt_h 1 0 0
  57. #&gt;
  58. #&gt; [[4]]
  59. #&gt; pollinator_r pollinator_i pollinator_l pollinator_m pollinator_z
  60. #&gt; plnt_n 1 0 0 0 0
  61. #&gt; plnt_d 0 1 0 0 0
  62. #&gt; plnt_g 0 0 1 0 0
  63. #&gt; plnt_v 0 0 0 1 0
  64. #&gt; plnt_y 0 0 0 0 1
  65. #&gt; plnt_l 0 0 0 0 0
  66. #&gt; plnt_r 0 0 0 0 0
  67. #&gt; plnt_j 0 0 0 0 0
  68. #&gt; pollinator_k pollinator_o pollinator_c pollinator_j pollinator_x
  69. #&gt; plnt_n 0 0 0 0 0
  70. #&gt; plnt_d 0 0 0 0 0
  71. #&gt; plnt_g 0 0 0 0 0
  72. #&gt; plnt_v 0 0 1 0 0
  73. #&gt; plnt_y 0 0 0 0 0
  74. #&gt; plnt_l 1 0 0 0 1
  75. #&gt; plnt_r 0 1 0 0 0
  76. #&gt; plnt_j 0 0 0 1 0
  77. #&gt;
  78. #&gt; [[5]]
  79. #&gt; pollinator_l pollinator_p pollinator_f pollinator_x pollinator_m
  80. #&gt; plnt_m 1 0 0 1 0
  81. #&gt; plnt_i 0 1 0 0 0
  82. #&gt; plnt_x 0 0 1 0 0
  83. #&gt; plnt_k 0 0 0 0 1
  84. #&gt; plnt_l 0 0 0 0 0
  85. #&gt; plnt_z 0 0 0 0 0
  86. #&gt; pollinator_u pollinator_e pollinator_r pollinator_b pollinator_a
  87. #&gt; plnt_m 0 0 0 0 0
  88. #&gt; plnt_i 0 0 1 0 1
  89. #&gt; plnt_x 1 0 0 0 0
  90. #&gt; plnt_k 0 0 0 0 0
  91. #&gt; plnt_l 0 1 0 0 0
  92. #&gt; plnt_z 0 0 0 1 0
  93. #&gt;
  94. #&gt; [[6]]
  95. #&gt; pollinator_d pollinator_x pollinator_n pollinator_y pollinator_s
  96. #&gt; plnt_k 1 0 0 0 0
  97. #&gt; plnt_b 0 1 0 0 0
  98. #&gt; plnt_m 0 0 1 0 0
  99. #&gt; plnt_g 0 0 0 1 0
  100. #&gt; plnt_z 0 0 0 0 1
  101. #&gt; plnt_j 0 0 0 0 0
  102. #&gt; plnt_x 0 0 0 0 0
  103. #&gt; plnt_v 0 0 0 0 0
  104. #&gt; pollinator_k pollinator_i pollinator_c
  105. #&gt; plnt_k 0 0 0
  106. #&gt; plnt_b 0 0 0
  107. #&gt; plnt_m 1 0 0
  108. #&gt; plnt_g 0 0 0
  109. #&gt; plnt_z 0 0 0
  110. #&gt; plnt_j 1 0 0
  111. #&gt; plnt_x 0 1 0
  112. #&gt; plnt_v 0 0 1
  113. #&gt;
  114. #&gt; [[7]]
  115. #&gt; pollinator_r pollinator_x pollinator_k pollinator_j pollinator_u
  116. #&gt; plnt_q 1 0 0 0 0
  117. #&gt; plnt_o 0 1 0 0 0
  118. #&gt; plnt_z 0 0 1 0 0
  119. #&gt; plnt_t 0 1 0 0 0
  120. #&gt; plnt_g 0 0 0 1 0
  121. #&gt; plnt_e 0 0 0 0 1
  122. #&gt; plnt_p 0 0 0 0 1
  123. #&gt; plnt_r 0 0 0 0 0
  124. #&gt; plnt_n 0 0 0 0 0
  125. #&gt; pollinator_a pollinator_s pollinator_d
  126. #&gt; plnt_q 0 0 0
  127. #&gt; plnt_o 0 0 1
  128. #&gt; plnt_z 0 0 0
  129. #&gt; plnt_t 0 0 0
  130. #&gt; plnt_g 0 0 0
  131. #&gt; plnt_e 0 0 0
  132. #&gt; plnt_p 0 0 0
  133. #&gt; plnt_r 1 0 0
  134. #&gt; plnt_n 0 1 0
  135. #&gt;
  136. #&gt; [[8]]
  137. #&gt; pollinator_g pollinator_b pollinator_m pollinator_v pollinator_c
  138. #&gt; plnt_w 1 0 0 1 0
  139. #&gt; plnt_l 0 1 0 0 0
  140. #&gt; plnt_s 0 0 1 0 0
  141. #&gt; plnt_c 0 0 0 1 0
  142. #&gt; plnt_p 0 0 0 0 1
  143. #&gt; plnt_x 0 0 0 0 0
  144. #&gt; plnt_d 0 0 0 0 0
  145. #&gt; plnt_r 0 0 0 0 0
  146. #&gt; pollinator_o pollinator_z pollinator_t pollinator_j
  147. #&gt; plnt_w 0 0 0 0
  148. #&gt; plnt_l 0 0 0 0
  149. #&gt; plnt_s 0 0 0 0
  150. #&gt; plnt_c 0 0 0 1
  151. #&gt; plnt_p 0 0 0 0
  152. #&gt; plnt_x 1 0 0 0
  153. #&gt; plnt_d 0 1 0 0
  154. #&gt; plnt_r 0 0 1 0
  155. #&gt;
  156. #&gt; [[9]]
  157. #&gt; pollinator_g pollinator_x pollinator_f pollinator_v pollinator_q
  158. #&gt; plnt_t 1 0 0 0 0
  159. #&gt; plnt_k 0 1 0 0 0
  160. #&gt; plnt_l 0 0 1 0 0
  161. #&gt; plnt_r 0 0 0 1 0
  162. #&gt; plnt_b 0 0 0 0 1
  163. #&gt; plnt_s 0 0 0 0 0
  164. #&gt; plnt_m 0 0 0 0 0
  165. #&gt; plnt_n 0 0 1 0 0
  166. #&gt; plnt_g 0 0 0 0 0
  167. #&gt; pollinator_z pollinator_e pollinator_n pollinator_w
  168. #&gt; plnt_t 0 0 0 0
  169. #&gt; plnt_k 0 0 0 0
  170. #&gt; plnt_l 1 0 0 0
  171. #&gt; plnt_r 0 0 0 0
  172. #&gt; plnt_b 0 0 0 0
  173. #&gt; plnt_s 0 1 0 0
  174. #&gt; plnt_m 0 0 1 0
  175. #&gt; plnt_n 0 0 0 0
  176. #&gt; plnt_g 0 0 0 1
  177. #&gt;
  178. #&gt; [[10]]
  179. #&gt; pollinator_i pollinator_q pollinator_g pollinator_b pollinator_p
  180. #&gt; plnt_p 1 0 0 0 0
  181. #&gt; plnt_h 0 1 0 0 0
  182. #&gt; plnt_y 0 0 1 0 0
  183. #&gt; plnt_s 0 0 0 1 0
  184. #&gt; plnt_z 0 0 0 0 1
  185. #&gt; plnt_j 0 0 0 0 0
  186. #&gt; plnt_e 0 0 0 0 0
  187. #&gt; plnt_m 0 0 0 0 0
  188. #&gt; plnt_x 0 0 0 0 0
  189. #&gt; pollinator_o pollinator_z pollinator_a pollinator_y pollinator_h
  190. #&gt; plnt_p 0 0 0 0 0
  191. #&gt; plnt_h 0 0 0 0 0
  192. #&gt; plnt_y 0 0 0 0 0
  193. #&gt; plnt_s 0 0 0 0 0
  194. #&gt; plnt_z 0 0 0 0 0
  195. #&gt; plnt_j 1 1 0 0 0
  196. #&gt; plnt_e 0 0 1 0 0
  197. #&gt; plnt_m 0 0 0 1 0
  198. #&gt; plnt_x 0 0 0 0 1

<sup>Created on 2023-02-19 with reprex v2.0.2</sup>

答案2

得分: 2

避免使用 igraph,使用 table()

  1. ## from question.
  2. set.seed(75498353)
  3. n <- 10 # 植物和传粉者的数量。
  4. network_list <- replicate(2, expr = {
  5. data.frame( plant = paste('plnt', '_', sample(x = letters, size = n, replace = TRUE), sep = ""),
  6. pollinator = paste('pollinator', '_', sample(x = letters, size = n, replace = TRUE), sep = "")
  7. )
  8. }, simplify = FALSE)
  9. ## 创建关联矩阵的列表。
  10. incidence_list <- lapply(network_list, table)
  11. incidence_list

注意:代码部分不翻译。

英文:

Avoid igraph and use table().

  1. ## from question.
  2. set.seed(75498353)
  3. n &lt;- 10 # size of plant, pollinator.
  4. network_list &lt;- replicate(2, expr = {
  5. data.frame( plant = paste(&#39;plnt&#39;, &#39;_&#39;, sample(x = letters, size = n, replace = TRUE), sep = &quot;&quot;),
  6. pollinator = paste(&#39;pollinator&#39;, &#39;_&#39;, sample(x = letters, size = n, replace = TRUE), sep = &quot;&quot;)
  7. )
  8. }, simplify = FALSE)
  9. ## create list of incidence matrices.
  10. incidence_list &lt;- lapply(network_list, table)
  11. incidence_list

huangapple
  • 本文由 发表于 2023年2月19日 14:17:14
  • 转载请务必保留本文链接:https://go.coder-hub.com/75498353.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定