Julia看起来很有希望进行快速和语法理智的计算(例如这里),但我怀疑它在整体统计工作流程方面还不会在R附近.所以我想在C++主要用于R程序的地方使用它:优化代码的慢速部分.然而,在我花时间学习Julia之前,我很好奇在R代码中嵌入Julia片段的设施是什么.
所以:
我想从R调用Julia,就像Rcpp现在允许从R内部调用C++一样.我不想从朱莉娅那里打电话给R. (所以RCall.jl不起作用)
具体来说:我正在尝试使用Julia的DataFrames包,特别是带有names选项的readtable()函数,但这需要一个符号向量.
到目前为止,我发现只有少数几个对朱莉娅语中的单词符号的引用.看起来符号用":var"表示,但我不清楚它们是什么.
旁白:我可以跑
df = readtable( "table.txt", names = [symbol("var1"), symbol("var2")] )
Run Code Online (Sandbox Code Playgroud)
我的两个项目符号仍然存在.
f
当使用?f
或通过REPL检查时,用户定义的函数(比如说)如何具有有意义的打印输出help(f)
例如,想象一下我写下面的函数
function f(x::Float64, y::Float64)
return 2x - y^2
end
Run Code Online (Sandbox Code Playgroud)
如果我把它加载到julia会话中并尝试help(f)
我得到以下内容:
julia> help(f)
f (generic function with 1 method)
Run Code Online (Sandbox Code Playgroud)
如果相反我想看到类似的东西怎么办?
julia> help(f)
f
Compute 2 times x minus y squared
Run Code Online (Sandbox Code Playgroud)
其中描述"计算2次x减y平方"的描述.我猜我的问题的答案可以从问题的答案中确定:"描述应该写在哪里?"
举例来说,如果我想在python中做同样的事情,我可以定义函数并将描述作为文档字符串:
def f(x, y):
"""
Compute 2 times x minus y squared
"""
return 2 * x - y ** 2
Run Code Online (Sandbox Code Playgroud)
当我输入help(f)
或f?
从IPython 时,这将使我的描述立即可用.
朱莉娅将性能与R进行比较的例子似乎特别令人费解. https://github.com/JuliaLang/julia/blob/master/test/perf/perf.R
你可以从下面的两种算法中获得最快的性能(最好解释你改变了什么以使它更像R)?
## mandel
mandel = function(z) {
c = z
maxiter = 80
for (n in 1:maxiter) {
if (Mod(z) > 2) return(n-1)
z = z^2+c
}
return(maxiter)
}
mandelperf = function() {
re = seq(-2,0.5,.1)
im = seq(-1,1,.1)
M = matrix(0.0,nrow=length(re),ncol=length(im))
count = 1
for (r in re) {
for (i in im) {
M[count] = mandel(complex(real=r,imag=i))
count = count + 1
}
}
return(M)
}
assert(sum(mandelperf()) == 14791)
## quicksort ##
qsort_kernel = function(a, …
Run Code Online (Sandbox Code Playgroud) 在Julia中,打印格式化字符串的语法如下:
@printf("Hello %d\n", 5)
Run Code Online (Sandbox Code Playgroud)
为什么是@printf
宏而不是函数?它是否可以接受不同数量的参数?
2018年更新:请务必检查所有回复,因为这个问题的答案多年来已经多次改变.在此更新时,Revise.jl
答案可能是最佳解决方案.
我有一个文件"/SomeAbsolutePath/ctbTestModule.jl",其内容是:
module ctbTestModule
export f1
f1(x) = x + 1
end
Run Code Online (Sandbox Code Playgroud)
我在一个运行"〜/ .juliarc.jl"的终端中点燃Julia.启动代码包括以下行:
push!(LOAD_PATH, "/SomeAbsolutePath/")
Run Code Online (Sandbox Code Playgroud)
因此我可以立即输入Julia控制台:
using ctbTestModule
Run Code Online (Sandbox Code Playgroud)
加载我的模块.正如预期的f1(1)
回报2
.现在我突然决定要编辑f1
.我在编辑器中打开"/SomeAbsolutePath/ctbTestModule.jl",并将内容更改为:
module ctbTestModule
export f1
f1(x) = x + 2
end
Run Code Online (Sandbox Code Playgroud)
我现在尝试在我的活跃Julia会话中重新加载模块.我试试
using ctbTestModule
Run Code Online (Sandbox Code Playgroud)
但f1(1)
仍然返回2
.接下来我尝试:
reload("ctbTestModule")
Run Code Online (Sandbox Code Playgroud)
正如这里所建议的,但f1(1)
仍然会回归2
.最后,我尝试:
include("/SomeAbsolutePath/ctbTestModule.jl")
Run Code Online (Sandbox Code Playgroud)
正如这里所建议的那样,这是不理想的,因为我必须输入完整的绝对路径,因为当前目录可能不是"/ SomeAbsolutePath".我收到的警告信息Warning: replacing module ctbTestModule
听起来很有希望,但f1(1)
仍然会返回2
.
如果我关闭当前的Julia会话,启动一个新会话并输入using ctbTestModule
,我现在得到所需的行为,即f1(1)
返回3
.但显然我想在不 …
我是朱莉娅的新手,刚刚完成了我的第一个项目.我在julia-studio中编写了代码,并在该程序中进行了测试.它给了我所有正确的输出,但是shell将输出分开,好像它是两个不同的执行.
我想知道我的编译器是否有问题,所以我想我会尝试在julialang.org上找到的默认julia shell中编译它.
但是,我无法理解和/或弄清楚如何在那里运行它.我当前的程序从同一目录中的另一个文件读取输入并输出结果.
任何人都可以解释如何运行该程序.这个http://julia.readthedocs.org/en/latest/manual/getting-started/对我没有意义.
示例输出:
julia> program
#
#
#
#
julia>
#
#
#
#
#
Run Code Online (Sandbox Code Playgroud)
#表示整数.理想情况下,输出不应与"julia>"分开
在他们的arXiv论文中,Julia的原作者提到了以下内容:
2.14 Parallelism
.并行执行由Julia在标准库中实现的基于消息的多处理系统提供.语言设计通过提供对称协程来支持这些库的实现,协同协程也可以被认为是协同调度的线程.此功能允许异步通信隐藏在库中,而不是要求用户设置回调.朱目前不支持本地线程,这是一种限制,但具有避免同步共享内存的使用的复杂性的优点.
他们说朱莉娅不支持原生线程是什么意思?什么是本机线程?
其他解释性语言(如Python或R)是否支持这种并行性?朱莉娅独自一人吗?
Julia语言每次编译脚本,我们不能用julia编译二进制文件吗?我尝试了一个带有println函数的小helloworld脚本,julia花了2,3秒来显示输出!如果我们可以制作二进制文件而不是每次编译都会更好
更新:朱莉娅有一些变化,因为我问过这个问题.虽然我不再关注julia的更新,因为我已经问过这个问题,如果你正在寻找类似的东西,请查看以下答案和关注julia的人的评论.
此外,很高兴知道现在加载脚本大约需要150毫秒.