如何在 R 中存储"complex"数据结构(不是"complex numbers")



我需要训练、存储和使用几个ksvm SVM模型的列表/数组/任何东西,一旦我获得了一组传感器读数,我就可以依次在每个模型上调用predict()。我想把这些关于tham的模型和元数据存储在某种数据结构中,但我对R不太熟悉,掌握它的数据结构一直是一个挑战。我熟悉C++、C和C#。

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

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

  • ksvm模型本身
  • 一个字符串说谁训练了模型&当他们训练它的时候
  • 一组数字,指示哪些传感器的数据应提交给该模型
  • 1到100之间的一个数字,表示我作为培训师对该模型的信任程度
  • 一些"其他东西">

所以在修改如何做到这一点时,我尝试了以下。。。。

首先,我尝试了我认为非常简单的东西&crude,希望稍后在它的基础上进行构建(如果有效的话):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"
> 

wha?它认为我想替换什么?我只是想填充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
> 

Drat。仍然没有工作。

请告诉我该怎么做。我真的希望能够通过名称访问我的数据结构中的字段,也许是类似于。。。

> print(TestModels[1]["TrainedAt"])

非常感谢!

你非常接近。为了避免警告,你不应该使用

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"

最新更新