2016-10-12 4 views
3

Я новый для классов S4 и искал решение, но не смог :( У меня есть список классов S4, не уверен, что это вложенный список, но я хочу изменить его на фрейм данных. Мой список выглядит так по имени гСписок классов S4 к кадру данных

head(z) 
[[1]] 
An object of class "AgNode" 
Slot "center": 
x: 1515, y: 2258 

Slot "name": 
[1] "hsa:4052" 

Slot "txtLabel": 
An object of class "AgTextLabel" 
Slot "labelText": 
[1] "hsa:4052" 

Slot "labelLoc": 
x: 0, y: 0 

Slot "labelJust": 
[1] "n" 

Slot "labelWidth": 
[1] 50 

[[2]] 
An object of class "AgNode" 
Slot "center": 
x: 1443, y: 2567 

Slot "name": 
[1] "hsa:1311" 

Slot "txtLabel": 
An object of class "AgTextLabel" 

и так далее, я хочу, чтобы извлечь X и значение Y от центра слота и имени из гнезда имени. и поставил три в кадре данных. Как могу я это сделать?

see<-do.call(cbind, lapply(z, stack)) 

я попытался это, но он дает ошибку

Error in as.list.default(x) : 
no method for coercing this S4 class to a vector 

Помогите мне?

ответ

4

Если вы хотите «один вкладыш»:

purrr::map_df(x, ~as.list(set_names(getPoints(getNodeCenter(.)), c("x", "y"))))` 

но мне нравится по буквам их, если нет падения производительности, так как в конечном счете, мы программируем для человека:

library(Rgraphviz) 
library(purrr) 

V <- letters[1:10] 
M <- 1 
g1 <- randomGraph(V, M, .2) 
z <- agopen(g1,name="foo") 
x <- AgNode(z) 

map(x, getNodeCenter) %>% 
    map(getPoints) %>% 
    map(set_names, c("x", "y")) %>% 
    map_df(as.list) 
## # A tibble: 10 × 2 
##  x  y 
## <int> <int> 
## 1  73 348 
## 2  73 243 
## 3 145 348 
## 4 217 348 
## 5 289 348 
## 6  27 137 
## 7  82 32 
## 8 361 348 
## 9 433 348 
## 10 505 348 

Это также:

library(magrittr) 

lapply(x, getNodeCenter) %>% 
    lapply(getPoints) %>% 
    lapply(set_names, c("x", "y")) %>% 
    lapply(as.list) %>% 
    do.call(rbind.data.frame, .) 

, если вы не хотите использовать purrr но готовы использовать трубопровод или:

do.call(rbind.data.frame, lapply(x, function(y) { 
    as.list(setNames(getPoints(getNodeCenter(y)), c("x", "y"))) 
})) 

, если вам не нравится, трубопроводов, или:

do.call(rbind.data.frame, lapply(x, function(y) { 
    tmp <- getNodeCenter(y) 
    tmp <- getPoints(tmp) 
    tmp <- setNames(tmp, c("x", "y")) 
    as.list(tmp) 
})) 

, если вы хотите, чтобы быть читаемыми и не использовать purrr или трубопровод.

 Смежные вопросы

  • Нет связанных вопросов^_^