如何制作直方图,其中每个条的中心位于公共轴上?这看起来像一个阶梯形边缘的小提琴情节.
我想在莱迪思这样做,并不介意自定义面板功能等,但很乐意使用基本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) 我正在使用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) 文档字符串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) 有什么区别lein run,lein trampoline run并将cojure应用程序部署为uberjar?有任何性能差异吗?
如果我这样做lein run/ lein trampoline run我可以直接进入服务器并从git中取出我的更改,而无需重新启动应用程序,对于uberjar也是如此.对于uberjars,我需要构建和部署应用程序.
提前致谢.
从一个彻头彻尾的新人到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的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将无法编译 - 编译器似乎随机创建bar或baz作为状态变量Foo,因此只有其中一个可用Bar.无论如何,我没有看到如何初始化bar和baz使用init函数.
在单线程程序中使用: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.
那是对的吗?我不明白有什么危险?
有没有办法以编程方式将我的主目录的名称插入到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`.
我正在尝试扩展库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) 有没有一种方法可以使可选参数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)