-
Notifications
You must be signed in to change notification settings - Fork 36
/
interface.R
157 lines (151 loc) · 4.2 KB
/
interface.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
#' \code{do.call} for julia.
#'
#' \code{julia_do.call} is the \code{do.call} for julia.
#'
#' @param func_name the name of julia function you want to call.
#' @param arg_list the unnamed list of the arguments you want to pass to the julia function.
#' @param need_return whether you want the julia to return value or not.
#'
#' @examples
#'
#' if (julia_check()) {
#' \dontrun{ ## julia_setup is quite time consuming
#' julia <- julia_setup()
#'
#' julia_do.call("sqrt", list(2))
#' }
#' }
#'
#' @export
julia_do.call <- julia$do.call <- function(func_name, arg_list, need_return = TRUE){
if (!(length(func_name) == 1 && is.character(func_name))) {
stop("func_name should be a character scalar.")
}
if (!(is.list(arg_list))) {
stop("arg_list should be the list of arguments.")
}
if (!(is.null(names(arg_list)))) {
stop("JuliaCall currently doesn't accept named arguments, we are working on that.")
}
if (!(length(need_return) == 1 && is.logical(need_return))) {
stop("need_return should be a logical scalar.")
}
r <- .julia$do.call_(func_name, arg_list, need_return)
if (inherits(r, "error")) stop(r)
if (need_return) return(r)
invisible(r)
}
#' Call julia functions.
#'
#' \code{julia_call} calls julia functions.
#'
#' @param func_name the name of julia function you want to call.
#' @param ... the unnamed arguments you want to pass to the julia function.
#' @param need_return whether you want the julia return value or not.
#'
#' @examples
#'
#' if (julia_check()) {
#' \dontrun{ ## julia_setup is quite time consuming
#' julia <- julia_setup()
#'
#' julia_call("sqrt", 2)
#' }
#' }
#'
#' @export
julia_call <- julia$call <- function(func_name, ..., need_return = TRUE)
julia$do.call(func_name, list(...), need_return)
#' Check whether a julia object with the given name exists or not.
#'
#' \code{julia_exists} returns whether a julia object with the given name exists or not.
#'
#' @param name the name of julia object you want to check.
#'
#' @examples
#'
#' if (julia_check()) {
#' \dontrun{ ## julia_setup is quite time consuming
#' julia <- julia_setup()
#'
#' julia_exists("sqrt")
#' }
#' }
#'
#' @export
julia_exists <- julia$exists <- function(name) julia$call("JuliaCall.exists", name)
#' Evaluate string commands in julia and get the result.
#'
#' \code{julia_eval_string} evaluates string commands in julia and
#' returns the result (automatically converted to an R object).
#' If you don't need the result, maybe you could
#' try \code{julia_command}.
#'
#' @param cmd the command string you want to evaluate in julia.
#'
#' @return the R object automatically converted from julia object.
#'
#' @examples
#'
#' if (julia_check()) {
#' \dontrun{ ## julia_setup is quite time consuming
#' julia <- julia_setup()
#'
#' julia_eval_string("sqrt(2)")
#' }
#' }
#'
#' @export
julia_eval_string <- julia$eval_string <-
function(cmd) julia$call("JuliaCall.eval_string", cmd)
#' Evaluate string commands in julia.
#'
#' \code{julia_command} evaluates string commands in julia
#' without returning the result.
#' If you need the result, maybe you could
#' try \code{julia_eval_string}.
#'
#' @param cmd the command string you want to evaluate in julia.
#'
#' @examples
#'
#' if (julia_check()) {
#' \dontrun{ ## julia_setup is quite time consuming
#' julia <- julia_setup()
#'
#' julia_command("a = sqrt(2)")
#' }
#' }
#'
#' @export
julia_command <- julia$command <-
function(cmd) julia$call("JuliaCall.eval_string", cmd, need_return = FALSE)
#' Source a julia source file.
#'
#' \code{julia_source} sources a julia source file.
#'
#' @param file_name the name of julia source file.
#'
#' @export
julia_source <- julia$source <-
function(file_name) julia$call("include", file_name, need_return = FALSE)
#' Get help for a julia function.
#'
#' \code{julia_help} outputs the documentation of a julia function.
#'
#' @param fname the name of julia function you want to get help with.
#'
#' @examples
#'
#' if (julia_check()) {
#' \dontrun{ ## julia_setup is quite time consuming
#' julia <- julia_setup()
#'
#' julia_help("sqrt")
#' }
#' }
#'
#' @export
julia_help <- julia$help <- function(fname){
cat(julia$call("JuliaCall.help", fname))
}