将任意深度的输入转换为向量

时间:2014-01-31 19:30:20

标签: r vector clojure clojure-contrib

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

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

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

#{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.此函数的重要性在于统计/数据分析中向量结构的重要性。

2 个答案:

答案 0 :(得分: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]]]

答案 1 :(得分:1)

天真的减少实施:

(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]]]