小编Mar*_*ars的帖子

对称的小提琴情节直方图?

如何制作直方图,其中每个条的中心位于公共轴上?这看起来像一个阶梯形边缘的小提琴情节.

我想在莱迪思这样做,并不介意自定义面板功能等,但很乐意使用基本R图形甚至ggplot2.(我还没有把自己投入到ggplot2中,但是会在某些时候采取行动.)

(为什么我要这样做?我认为当数据是离散的并且以几个[5-50]均匀间隔的数值出现时,它可能是一个有用的替代小提琴图.每个bin然后代表一个点.当然我可以生成一个正常的直方图.但我认为有时显示盒须图和小提琴图是有用的.对于定期间隔的离散数据,具有与boxplot相同方向的对称直方图可以进行比较用箱形图绘制数据的详细结构,就像小提琴情节一样.在这种情况下,对称直方图可能比小提琴情节更具信息性.(豆图可能是我刚才描述的另一种选择,尽管事实上我的数据不是字面上离散的 - 它只是收敛到一系列常规值附近.这使得R的beanplot包对我来说没用,除非我通过将它们映射到最接近的常规值来规范化值.))

以下是一些数据的30个观察子集,它是由基于代理的模拟生成的:

df30 <- data.frame(crime.v=c(0.2069526, 0.2063516, 0.06919754,
0.2080366, -0.06975912, 0.206277, 0.3457634, 0.2058985, 0.3428499,
0.3428159, 0.06746109, -0.07068694, 0.4826098, -0.06910966, 0.06769761,
0.2098732, 0.3482267, 0.3483602, 0.4829777, 0.06844112, 0.2093492,
0.4845478, 0.2093505, 0.3482845, 0.3459249, 0.2106339, 0.2098397,
0.4844956, 0.2108985, 0.2107984), bias=c("beast", "beast", "beast",
"beast", "beast", "beast", "beast", "beast", "beast", "beast", "beast",
"beast", "beast", "beast", "beast", "virus", "virus", "virus", "virus",
"virus", "virus", "virus", "virus", "virus", "virus", "virus", "virus",
"virus", "virus", "virus"))
Run Code Online (Sandbox Code Playgroud)

df可以从此链接下载以Rdata文件中的完整600个观察值命名的数据框:CVexample.rdata.

这些crime.v值都接近以下之一,我称之为焦点:

[1] -0.89115386 -0.75346155 -0.61576924 -0.47807693 …
Run Code Online (Sandbox Code Playgroud)

r lattice

7
推荐指数
2
解决办法
1759
查看次数

D3树:线而不是对角线投影

我正在使用d3.js使用此示例创建树.

这样可以完美地处理我拥有的数据并产生所需的结果,除了一个细节:我不希望节点之间有那些扭曲的连接线,我想要一条干净简单的线.有谁能告诉我如何制作它?

我一直在查看d3.js的API文档,但没有成功.根据我的理解,svg.line函数应该在给定一组两对坐标(x,y)的情况下产生一条直线.我认为我需要知道的是:给定这些数据,如何在链接数组中给出每对节点的(cx,cy)创建一条线:

var margin = {top: 40, right: 40, bottom: 40, left: 40};

var width = 960 - margin.left - margin.right; 

var height = 500 - margin.top - margin.bottom;

var tree = d3.layout.tree()
    .size([height, width]);

var diagonal = d3.svg.diagonal()
    .projection(function(d) { return [d.y, d.x]; });

var svg = d3.select("body").append("svg")
    .attr("width", width + margin.left + margin.right)
    .attr("height", height + margin.top + margin.bottom)
    .append("g")
    .attr("transform", "translate(" + margin.left + "," + …
Run Code Online (Sandbox Code Playgroud)

tree d3.js

7
推荐指数
1
解决办法
8250
查看次数

为什么更喜欢seq而不是非空作为谓词?

文档字符串empty?说"请使用成语(seq x)而不是(不是(空?x))". MisterMetaphor指出,seq在用于if-let以下情况时,使用谓词是有意义的:

(if-let [s (seq might-be-empty)]
   (fn-for-non-empty-seq s)
   (fn-for-empty-seq))
Run Code Online (Sandbox Code Playgroud)

但是,我真的应该用它seq来测试一般的非空虚吗? seq可以将其论证转换为不同的形式.例如:

user=> (class (lazy-seq '(1 2 3)))
clojure.lang.LazySeq
user=> (class (seq (lazy-seq '(1 2 3))))
clojure.lang.PersistentList
user=> (class (map inc [1 2 3]))
clojure.lang.LazySeq
user=> (class (seq (map inc [1 2 3])))
clojure.lang.ChunkedCons
Run Code Online (Sandbox Code Playgroud)

如果只是想测试非空虚,并且不需要新的绑定,或者如果我在绑定之前不需要转换,这似乎是浪费周期.not-empty在这种情况下不是更好的选择吗?nil如果其参数为空,则返回,如果非空,则返回其参数.

(if (not-empty [])
  "more to do"
  "all done")
Run Code Online (Sandbox Code Playgroud)

clojure

7
推荐指数
1
解决办法
1155
查看次数

lein run vs lein trampoline run vs uberjar

有什么区别lein run,lein trampoline run并将cojure应用程序部署为uberjar?有任何性能差异吗?

如果我这样做lein run/ lein trampoline run我可以直接进入服务器并从git中取出我的更改,而无需重新启动应用程序,对于uberjar也是如此.对于uberjars,我需要构建和部署应用程序.

提前致谢.

clojure uberjar leiningen

7
推荐指数
1
解决办法
2031
查看次数

加载clojure库的最简单方法是什么?

从一个彻头彻尾的新人到clojure的问题:如果我想从任何地方开始一个clojure REPL怎么办,例如因为我只是想计算一个指数?如何设置我的系统来执行此操作?(我之前删除了不完整答案的链接,因为它们弄错了问题.)@ Jared314下面的答案链接的石榴文档帮助我看到我可以这样做:

~$ lein repl
...
user=> (use '[cemerick.pomegranate :only (add-dependencies)])
nil
user=> (add-dependencies :coordinates '[[org.clojure/math.numeric-tower "0.0.2"]])
{[org.clojure/clojure "1.3.0"] nil, [org.clojure/math.numeric-tower "0.0.2"] #{[org.clojure/clojure "1.3.0"]}}
user=> (use 'clojure.math.numeric-tower)
nil
user=> (expt 2 3)
8
Run Code Online (Sandbox Code Playgroud)

好极了!

现在,无论我在哪个子目录中,每次启动REPL时如何才能实现这一点?

我想我只是对基本的clojure设置一无所知.对于那个很抱歉.

第二个主要编辑:

我已经发现,如果我使用没有lein的原始clojure,我可以在repl启动时执行命令.例如,如果文件.clojurerc包含文本(print "Yow!\n"),我可以这样做:

~$ java -cp /usr/local/lib/clojure-1.5.1/clojure-1.5.1.jar clojure.main -i .clojurerc -r
Clojure 1.5.1
Yow!
user=> 
Run Code Online (Sandbox Code Playgroud)

我能做这样的事lein吗?或者更好的是,在clojure中自动加载clojure.math.numeric-tower而不使用lein(因为对于简单的命令行实验,lein的启动比直接启动clojure慢).

(看起来我似乎并不是想靠自己来解决这个问题,但我并非如此.我一直在进行网络搜索和实验,但我一直在打砖墙.我开始觉得好像是clojure 用于完整的编程项目.我曾认为它可能适用于临时实验和计算(传统上是lisps,但Java不是).我不是想煽动争论.我只是感到沮丧.做我想做的事情应该有一个简单的,众所周知的公式.)

clojure

6
推荐指数
1
解决办法
1107
查看次数

如何使用Clojure的gen-class创建多个Java成员变量

这个答案约Clojure的Java的互操作一个非常古老的问题,介绍了如何使用gen-class:state:init关键字来创建一个单一的公共实例变量从Java访问.如果您只需要一个可用于Java类的数据,或者您可以要求Java类使用读取函数(例如,存储在状态变量中的映射),这就足够了.该方法还允许数据改变,例如通过将atoms 存储在状态变量中.

如果我想创建多个可直接在Java类中读取的实例变量,该怎么办?这可能吗?例如,我可以编译以下文件并执行Bar该类,并查看foo.bar打印出来的值42 .

Foo.clj:

(ns students.Foo
  (:gen-class
    :name students.Foo
    :state bar
    ; :state baz
    :init init))

(defn -init
  []
  [[] 42])
Run Code Online (Sandbox Code Playgroud)

Bar.java:

package students;

public class Bar {

    public static void main(String[] args) {
        Foo foo = new Foo();
        System.out.println(foo.bar);
        // System.out.println(foo.baz);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我取消注释baz行,Bar.java将无法编译 - 编译器似乎随机创建barbaz作为状态变量Foo,因此只有其中一个可用Bar.无论如何,我没有看到如何初始化barbaz使用init函数.

java clojure clojure-java-interop

6
推荐指数
1
解决办法
170
查看次数

单线程上下文中volatile-mutable字段的风险?

在单线程程序中使用:volatile-mutable限定符是否安全deftype?这是一个跟进这个问题,这一个这一个.(这是一个Clojure问题,但我添加了"Java"标签,因为Java程序员也可能对它有洞察力.)

我发现在一个程序中我可以通过使用:volatile-mutable字段deftype而不是原子来获得显着的性能提升,但我很担心,因为文档字符串deftype说:

请注意,可变字段非常难以正确使用,并且只是为了便于在Clojure本身中构建更高级别的构造,例如Clojure的引用类型.它们仅供专家使用 - 如果:volatile-mutable或:unynchronized-mutable的语义和含义对您来说不是很明显,那么您就不应该使用它们.

事实上,语义和影响:volatile-mutable不会马上对我明显.

然而,Emerick,Carper和Grand 的Clojure Programming第6章说:

这里的"Volatile"与Java中的volatile字段修饰符含义相同:读取和写入都是原子的,必须按程序顺序执行; 即,它们不能由JIT编译器或CPU重新排序.因此,挥发性物质并不令人惊讶,并且不会引起线程安全 - 但不协调,仍然完全对种族条件开放.

这似乎暗示只要访问单个volatile-mutable deftype字段都发生在一个线程中,就没有什么特别值得担心的了.(没有什么特别的,因为我还是要小心,我是如何处理的状态,如果我可能会使用懒惰序列.)因此,如果没有引入并行到我的Clojure程序,应该使用没有特殊的危险deftype:volatile-mutable.

那是对的吗?我不明白有什么危险?

java clojure thread-safety clojure-java-interop

6
推荐指数
1
解决办法
322
查看次数

如何在project.clj中引用环境变量或主目录

有没有办法以编程方式将我的主目录的名称插入到Leiningen的project.clj的文件路径中?

我在不同的机器上运行Leiningen项目,我有不同的主目录.该项目使用不由Maven管理的jar文件; 我下载'em并将它们放在一个与我的主目录相关的目录中,或者将它们复制到Leiningen项目中.第二种选择有效但不可取.

使用第一个选项的简单方法 - 将jar文件保存在其他位置 - 是添加软链接到Leiningen目录中的"somewhere"目录.这是有效的,但每台机器上的链接必须不同,所以我不能在git存储库中包含链接文件,而是宁愿在git repo中包含所有内容.

有没有办法在我的project.clj文件中使用环境变量,或以其他方式引用我的主目录?到目前为止,我已经浏览了示例项目文件并找不到解决方案.

我以为我可以在运行时构建路径字符串 - 毕竟,project.clj中的内容只是Clojure代码.由于将我的主目录硬编码到project.clj中没有任何问题:

  :resource-paths [/Users/myhomedir/dist/mason/jar/mason.19.jar")]
Run Code Online (Sandbox Code Playgroud)

我想我能做到这一点:

:resource-paths [(str (System/getenv "HOME") "/dist/mason/jar/mason.19.jar")]
Run Code Online (Sandbox Code Playgroud)

然而,Leiningen完全不喜欢这样:

java.lang.IllegalArgumentException: No implementation of method: :as-file of protocol: #'clojure.java.io/Coercions found for class: clojure.lang.PersistentList
Run Code Online (Sandbox Code Playgroud)

更改[...](vector ...)给出相同的错误,但最后使用'clojure.lang.Symbol`.

clojure leiningen

6
推荐指数
1
解决办法
824
查看次数

如何在Clojure/Clojurescript中重用deftype方法?

我正在尝试扩展库DomKM/silk.

具体来说,有deftype Route哪些实现协议Pattern,它有方法实现,我想在我的自定义Pattern协议实现中重用它.

https://github.com/DomKM/silk/blob/master/src/domkm/silk.cljx#L355

(deftype Route [name pattern]
  Pattern
  (-match [this -url]
          (when-let [params (match pattern (url -url))]
            (assoc params ::name name ::pattern pattern)))
  (-unmatch [this params]
            (->> (dissoc params ::name ::pattern)
                 (unmatch pattern)
                 url))
  (-match-validator [_]
                    map?)
  (-unmatch-validators [_]
                       {}))
Run Code Online (Sandbox Code Playgroud)

好的,所以我的实现看起来像这样,但我想"继承" Route的方法.我的意思是首先执行一些自定义逻辑,然后将其传递给原始Route方法.

(deftype MyRoute [name pattern]
  silk/Pattern
  (-match [this -url] 
    true) ;match logic here
  (-unmatch [this {nm ::name :as params}]
    true) ;unmatch logic here
  (-match-validator [_] map?)
  (-unmatch-validators …
Run Code Online (Sandbox Code Playgroud)

clojure clojurescript

6
推荐指数
1
解决办法
312
查看次数

强制可选参数使用更广泛的类型,并具有更严格的默认值

有没有一种方法可以使可选参数f足够灵活以具有 type 'a -> 'b,但仍然使其默认为identity,前提是identity具有 type 'a -> 'a

较早的问题 首先陈述我的问题,确切地说:

我想定义一个接受可选参数的函数,该参数是一个函数 ('a -> 'b)。默认值应该是身份,实际上是 ('a -> 'a),但我认为没有理由它不应该与更通用的 ('a -> 'b) 兼容。

然而,该问题随后包含一个示例来说明较小的问题。该问题的答案回应了更狭窄的问题。这是一般问题的简单说明:

# let g1 ~f x = f x;;
val g1 : f:('a -> 'b) -> 'a -> 'b = <fun>
Run Code Online (Sandbox Code Playgroud)

好吧,这就是我想要的类型。但我想f默认为一个identity函数。这应该是可能的,因为identityhas 类型'a -> 'bwhere 'bis 'a。但它不起作用:

# let g2 ?(f=identity) x = f x;;
val g2 : ?f:('a …
Run Code Online (Sandbox Code Playgroud)

ocaml

6
推荐指数
1
解决办法
406
查看次数