Я пишу функцию, для которой я ожидаю вернуть список (я называю его 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)