【问题标题】:Converting inputs of arbitrary depth to vectors将任意深度的输入转换为向量
【发布时间】:2014-01-31 19:30:19
【问题描述】:

采用一个函数,该函数输入一个集合、集合集合、集合、嵌套向量,其中包含集合等。因此,输入有时不是同一类型。如何将这样的输入转换为嵌套向量结构?在第一种情况下,我会使用

(into [] #{1 2 3 4})

将 into 转换为向量。 但是在集合中集合的情况下,我无法输出嵌套向量,即

#{1 2 3 #{1 2 3}}

同样,我可能有一个输入,例如

[1 2 3 (4 5 6)]

我想输出

[1 2 3 [4 5 6]]

这个想法是,有时我需要深入了解并挑选出一个集合或集合以变成一个向量。是否有可能拥有一个函数,它通常可以处理许多不同的结构输入并输出嵌套向量结构。即一个函数可以概括上述例子吗?我对样本进行了一些简化,例如我可能有诸如

之类的输入
[[[1 2 3 4] [#{1 2 3 4} 2 3 4] [(1 2 3 4) 2 3 4]]]

为了更深入地了解我正在尝试处理的函数,请考虑语言 R 中的函数 C。该函数的重要性在于向量结构在统计/数据分析中的重要性。

【问题讨论】:

  • 如果您用 R 语法写出您的输入和所需的输出,可能会有所帮助。
  • 您可能正在寻找的东西在 R 中被称为“列表”。列表是非结构化的,允许您以任何您喜欢的嵌套方式存储数据。使用 'list()' 函数初始化一个列表,然后使用 list_variable[[name]]<-... 语法存储东西。检索时,“unlist”函数会将内容转换为矢量。
  • 我想在 Clojure 中编写函数,但前提源于 R 中的函数 C。

标签: r vector clojure clojure-contrib


【解决方案1】:
user=> (use 'clojure.walk)
user=> (clojure.walk/postwalk (fn [e] (if (coll? e) (vec e) e)) '(1 2 3 #{4 5 6 (7 8 9)}))
[1 2 3 [4 5 6 [7 8 9]]]

【讨论】:

    【解决方案2】:

    一个简单的reduce实现:

    (defn to-vectors [c]
      (reduce #(conj %1 (if (coll? %2) (to-vectors %2) %2))
              [] c))
    
    user=> (to-vectors '[[[1 2 3 4] [#{1 2 3 4} 2 3 4] [(1 2 3 4) 2 3 4]]])  
    [[[1 2 3 4] [[1 2 3 4] 2 3 4] [[1 2 3 4] 2 3 4]]]
    

    【讨论】:

      猜你喜欢
      • 2018-03-31
      • 2016-09-25
      • 2021-11-22
      • 2016-06-13
      • 2020-06-13
      • 1970-01-01
      • 2013-04-28
      • 1970-01-01
      • 2011-10-18
      相关资源
      最近更新 更多