我需要训练,存储和使用列表/数组/几个ksvm SVM模型,一旦我得到一组传感器读数,我可以在每个模型上调用predict()
模型轮流。我想将这些模型和关于tham的元数据存储在某种数据结构中,但我对R不太熟悉,并且掌握其数据结构一直是一个挑战。我熟悉的是C ++,C和C#。
我设想某种类型的数组或列表,其中既包含ksvm模型,也包含有关它们的元数据。 (除了其他方面,元数据是必要的,用于了解当我在其上调用predict()
时如何选择和组织呈现给每个模型的输入数据。)
我想要存储在此数据结构中的数据包括以下数据结构的每个条目:
因此,在修补如何做到这一点时,我尝试了以下内容......
首先,我尝试了我认为非常简单的事情。原油,希望以后如果有效的话可以建立它:A((不同数据类型列表)列表)...
>
> uname = Sys.getenv("USERNAME", unset="UNKNOWN_USER")
> cname = Sys.getenv("COMPUTERNAME", unset="UNKNOWN_COMPUTER")
> trainedAt = paste("Trained at", Sys.time(), "by", uname, "on", cname)
> trainedAt
[1] "Trained at 2015-04-22 20:54:54 by mminich on MMINICH1"
> sensorsToUse = c(12,14,15,16,24,26)
> sensorsToUse
[1] 12 14 15 16 24 26
> trustFactor = 88
>
> TestModels = list()
> TestModels[1] = list(trainedAt, sensorsToUse, trustFactor)
Warning message:
In TestModels[1] = list(trainedAt, sensorsToUse, trustFactor) :
number of items to replace is not a multiple of replacement length
>
> TestModels
[[1]]
[1] "Trained at 2015-04-22 20:54:54 by mminich on MMINICH1"
>
...世界卫生大会?它认为我试图取代什么?我只是试图填充TestModels的元素1。后来我会添加一个元素[2],[3]等......但是这不起作用,我不知道为什么。也许我需要在前面将TestModels定义为列表列表......
> TestModels = list(list())
> TestModels[1] = list(trainedAt, sensorsToUse, trustFactor)
Warning message:
In TestModels[1] = list(trainedAt, sensorsToUse, trustFactor) :
number of items to replace is not a multiple of replacement length
>
嗯。那也没工作。让我们试试别的......
> TestModels = list(list())
> TestModels[1][1] = list(trainedAt, sensorsToUse, trustFactor)
Warning message:
In TestModels[1][1] = list(trainedAt, sensorsToUse, trustFactor) :
number of items to replace is not a multiple of replacement length
>
讨厌鬼。仍然没有工作。
请告诉我如何做到这一点。而且我真的希望能够通过名称访问我的数据结构的字段,也许是某些内容......
> print(TestModels[1]["TrainedAt"])
非常感谢!
答案 0 :(得分:3)
你非常接近。为避免警告,您不应使用
TestModels[1] = list(trainedAt, sensorsToUse, trustFactor)
但是
TestModels[[1]] = list(trainedAt, sensorsToUse, trustFactor)
要访问列表元素,请使用[[ ]]
。在列表上使用[ ]
将返回包含单括号内元素的列表。显示警告是因为您正在使用包含3个元素的列表替换包含一个元素的列表(因为这是您创建它的方式)。这对其他元素来说不是问题:
TestModels[2] = list(trainedAt, sensorsToUse, trustFactor) # This element did not exist, so no replacement warning
要更好地理解列表子集,请看一下:
item1 <- list("a", 1:10, c(T, F, T))
item2 <- list("b", 11:20, c(F, F, F))
mylist <- list(item1=item1, item2=item2)
mylist[1] #This returns a list containing the item 1.
#$item1 #Note the item name of the container list
#$item1[[1]]
#[1] "a"
#
#$item1[[2]]
# [1] 1 2 3 4 5 6 7 8 9 10
#
#$item1[[3]]
#[1] TRUE FALSE TRUE
#
mylist[[1]] #This returns item1
#[[1]] #Note this is the same as item1
#[1] "a"
#
#[[2]]
# [1] 1 2 3 4 5 6 7 8 9 10
#
#[[3]]
#[1] TRUE FALSE TRUE
要按名称访问列表项,只需在创建列表时命名:
mylist <- list(var1 = "a", var2 = 1:10, var3 = c(T, F, T))
mylist$var1 #Or mylist[["var1"]]
# [1] "a"
您可以像建议的那样嵌套此运算符。所以你可以使用
containerlist <- list(mylist)
containerlist[[1]]$var1
#[1] "a"