如何存储"复杂" R中的数据结构(不是"复数")

时间:2015-04-23 01:12:37

标签: r

我需要训练,存储和使用列表/数组/几个ksvm SVM模型,一旦我得到一组传感器读数,我可以在每个模型上调用predict()模型轮流。我想将这些模型和关于tham的元数据存储在某种数据结构中,但我对R不太熟悉,并且掌握其数据结构一直是一个挑战。我熟悉的是C ++,C和C#。

我设想某种类型的数组或列表,其中既包含ksvm模型,也包含有关它们的元数据。 (除了其他方面,元数据是必要的,用于了解当我在其上调用predict()时如何选择和组织呈现给每个模型的输入数据。)

我想要存储在此数据结构中的数据包括以下数据结构的每个条目:

  • ksvm模型本身
  • 一个字符串,说明是谁训练了模特&当他们训练时
  • 一组数字,表示哪些传感器'数据应该呈现给这个模型
  • 1到100之间的单个数字,表示我,教练,相信这个模型
  • 一些"其他东西"

因此,在修补如何做到这一点时,我尝试了以下内容......

首先,我尝试了我认为非常简单的事情。原油,希望以后如果有效的话可以建立它: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"])

非常感谢!

1 个答案:

答案 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"