Как вернуть список списков, содержащих как векторы, так и списки с заданной длиной? - PullRequest
0 голосов
/ 22 апреля 2019

Я пишу функцию, для которой я ожидаю вернуть список (я называю его Layer).В каждом элементе списка должен быть список многих вещей (таких как A, B, C, D), некоторые из которых являются векторами (скажем, A и B), а некоторые другие являются списками (скажем, C и D).Мой желаемый вывод такой:

> output = MyFunction(...)
> output
$Layer[[1]]
$Layer[[1]]A
  ...
$Layer[[1]]B
  ...
$Layer[[1]]C
  ...
$Layer[[1]]D
  ...

$Layer[[3]]
$Layer[[3]]A
  ...
$Layer[[3]]B
  ...
$Layer[[3]]C
  ...
$Layer[[3]]D

Я пытался использовать

Layer[[r]] = list(.....)

в своей функции.Но R показывает сообщение об ошибке как:

attempt to select more than one element in integerOneIndex

Теперь я пытаюсь следующий код



MyFunction = function(Data, Cost, Time, MaxTime, Crit)){

  Layer = list()  
...


  Layer[r] = list(A = A, B = B, C = C, D = D)

  }                                                   
return(list(Layer = Layer))
}                                

Но R показывает предупреждение как:

number of items to replace is not a multiple of replacement length

Так что он далсписок длиннее, чем я ожидал, например:

> output = MyFunction(...)
> output
$Layer
$Layer[[1]]
$Layer[[1]][[1]]
[1] A
  ...
$Layer[[2]]
[1] B
  ...
$Layer[[3]]
[1] C
  ...
$Layer[[4]]
[1] D
  ...


$Layer[[17]][[1]]
[1] A
  ...
$Layer[[18]][[1]]
[1] B
  ...
$Layer[[19]][[1]]
[1] C
  ...
$Layer[[20]][[1]]
[1] D

Поскольку A, B, C, D - это разные типы объектов (векторы и списки), и они имеют разную длину, как я долженсделать, чтобы поместить их всех в один элемент (i-й слой) возвращаемого списка?

Мои данные

   A1 A2 A3 A4 A5 A6 A7 Class
1   A  A  A  A  A  A  A     T
2   A  B  B  B  B  B  B     F
3   A  A  B  A  B  B  B     F
4   B  B  B  D  B  A  D     T
5   B  A  A  B  A  B  B     F
6   B  A  C  C  B  B  C     F
7   C  A  B  D  A  A  D     F
8   C  B  A  A  B  A  A     F
9   B  A  B  A  A  A  A     T
10  A  A  B  D  A  B  D     T

Cost = c(5, 4, 7, 2, 8, 2, 6)     
Time = c(4, 2, 3, 10, 6, 5, 11)   

Более короткая версия моего кода похожа:

MyFunction = function(Data, Cost, Time, MaxTime = 10){
  Ar = colnames(Data) 
  Layer = list()  
  current.layer = list(Node = list(rownames(Data)), Cost = 0, Time = 0)
  Layer[[1]] = current.layer
  AllNewNode = c() ; Done = c() ; Cost = c() ; Time = c() 
  for ( r in 1:ncol(Data)){
     Var = Ar[r]
     done = vector("list", nlevels(Data[,Var]))
     newNode = vector("list", nlevels(Data[,Var]))
     CostNi = c() ; TimeNi = c() 
 for (s in 1:nlevels(Data[,Var])){
               SS = subset(Data, Data[,Ar==Var] == levels(Data[,Var])[s])
               newNode[[s]] = rownames(SS)
               done[[s]] = c(Var)
               var = rep(1,ncol(Data))*(Ar==Var)
               CostNi[s] = current.layer$Cost + Cost[var==1]
               TimeNi[s] = current.layer$Time + Time[var==1]
             }     
   AllNewNode = c(AllNewNode, newNode)
   Done = c(Done, done)   
   Cost = c(Cost, CostNi) ; Time = c(Time, TimeNi)

  Layer[r] = list(Node = AllNewNode, Done = Done, Cost = Cost, Time = Time)

  }                                                   
return(list(Layer = Layer))
}                                



out = MyFunction(Data, Cost, Time, MaxTime = 10)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...