Clojure 为什么白炽灯在只查询一列时会丢失列标题?
当从数据集中选择两列时,结果将具有预期的两个给定列标题。但是,当只指定一列时,生成的一列将丢失其标题,取而代之的是标题为“0”: 这使得在以后的步骤中很难使用$order或其他采用列名的方法 也就是说,这将起作用Clojure 为什么白炽灯在只查询一列时会丢失列标题?,clojure,incanter,Clojure,Incanter,当从数据集中选择两列时,结果将具有预期的两个给定列标题。但是,当只指定一列时,生成的一列将丢失其标题,取而代之的是标题为“0”: 这使得在以后的步骤中很难使用$order或其他采用列名的方法 也就是说,这将起作用 (with-data data (->> ($ [:foo :bar]) ($order [:foo] :asc) (view))) 这将失败 (with-data data (->> ($ [:foo])
(with-data data
(->> ($ [:foo :bar])
($order [:foo] :asc)
(view)))
这将失败
(with-data data
(->> ($ [:foo])
($order [:foo] :asc)
(view)))
你知道哪里出了问题或者该怎么办吗?当你指出在单键情况下,白炽灯只是返回一个序列时,听起来你找到了正确的答案。解决这个问题的一种方法是,只需请求第二列并忽略第二个结果,或者在第二列之后将其放入一系列映射中,尽管这可能会稍微不那么优雅。只是有点粗俗,比如:
(map hash-map (repeat :key) result-seq)
您使用的是哪个版本的白炽灯?在最新版本中,此行为已更改,并且至少1.5.4工作正常。但要考虑到,
$
在将列名作为单个元素和向量传递时的行为是不同的:
incanter.main=> (def data (dataset [:foo :bar] [[:a :b] [:c :d]]))
#'incanter.main/data
incanter.main=> ($ :foo data)
(:a :c)
incanter.main=> ($ [:foo] data)
| :foo |
|------|
| :a |
| :c |
你能在每种情况下都包含一点
数据和一点输出吗?等等,我想我看到了发生了什么:两列示例中的白炽灯返回Incanter.core.Dataset
,一列示例中的clojure.lang.LazySeq
。这让我想起了。如果您仍然喜欢,我可以提供数据,但这可能已经有帮助了?即使是最少量的样本数据也可以,只需使用(def data(数据集[:foo:bar][[:a:b][:c:d]])
。