##// END OF EJS Templates
Add URL to warning about rpy2
Thomas Kluyver -
Show More
@@ -1,706 +1,707 b''
1 1 # -*- coding: utf-8 -*-
2 2 """
3 3 ======
4 4 Rmagic
5 5 ======
6 6
7 7 Magic command interface for interactive work with R via rpy2
8 8
9 9 .. note::
10 10
11 11 The ``rpy2`` package needs to be installed separately. It
12 12 can be obtained using ``easy_install`` or ``pip``.
13 13
14 14 You will also need a working copy of R.
15 15
16 16 Usage
17 17 =====
18 18
19 19 To enable the magics below, execute ``%load_ext rmagic``.
20 20
21 21 ``%R``
22 22
23 23 {R_DOC}
24 24
25 25 ``%Rpush``
26 26
27 27 {RPUSH_DOC}
28 28
29 29 ``%Rpull``
30 30
31 31 {RPULL_DOC}
32 32
33 33 ``%Rget``
34 34
35 35 {RGET_DOC}
36 36
37 37 """
38 38 from __future__ import print_function
39 39
40 40 #-----------------------------------------------------------------------------
41 41 # Copyright (C) 2012 The IPython Development Team
42 42 #
43 43 # Distributed under the terms of the BSD License. The full license is in
44 44 # the file COPYING, distributed as part of this software.
45 45 #-----------------------------------------------------------------------------
46 46
47 47 import sys
48 48 import tempfile
49 49 from glob import glob
50 50 from shutil import rmtree
51 51 import warnings
52 52
53 53 # numpy and rpy2 imports
54 54
55 55 import numpy as np
56 56
57 57 import rpy2.rinterface as ri
58 58 import rpy2.robjects as ro
59 59 try:
60 60 from rpy2.robjects import pandas2ri
61 61 pandas2ri.activate()
62 62 except ImportError:
63 63 pandas2ri = None
64 64 from rpy2.robjects import numpy2ri
65 65 numpy2ri.activate()
66 66
67 67 # IPython imports
68 68
69 69 from IPython.core.displaypub import publish_display_data
70 70 from IPython.core.magic import (Magics, magics_class, line_magic,
71 71 line_cell_magic, needs_local_scope)
72 72 from IPython.testing.skipdoctest import skip_doctest
73 73 from IPython.core.magic_arguments import (
74 74 argument, magic_arguments, parse_argstring
75 75 )
76 76 from IPython.external.simplegeneric import generic
77 77 from IPython.utils.py3compat import (str_to_unicode, unicode_to_str, PY3,
78 78 unicode_type)
79 79 from IPython.utils.text import dedent
80 80
81 81 class RInterpreterError(ri.RRuntimeError):
82 82 """An error when running R code in a %%R magic cell."""
83 83 def __init__(self, line, err, stdout):
84 84 self.line = line
85 85 self.err = err.rstrip()
86 86 self.stdout = stdout.rstrip()
87 87
88 88 def __unicode__(self):
89 89 s = 'Failed to parse and evaluate line %r.\nR error message: %r' % \
90 90 (self.line, self.err)
91 91 if self.stdout and (self.stdout != self.err):
92 92 s += '\nR stdout:\n' + self.stdout
93 93 return s
94 94
95 95 if PY3:
96 96 __str__ = __unicode__
97 97 else:
98 98 def __str__(self):
99 99 return unicode_to_str(unicode(self), 'utf-8')
100 100
101 101 def Rconverter(Robj, dataframe=False):
102 102 """
103 103 Convert an object in R's namespace to one suitable
104 104 for ipython's namespace.
105 105
106 106 For a data.frame, it tries to return a structured array.
107 107 It first checks for colnames, then names.
108 108 If all are NULL, it returns np.asarray(Robj), else
109 109 it tries to construct a recarray
110 110
111 111 Parameters
112 112 ----------
113 113
114 114 Robj: an R object returned from rpy2
115 115 """
116 116 is_data_frame = ro.r('is.data.frame')
117 117 colnames = ro.r('colnames')
118 118 rownames = ro.r('rownames') # with pandas, these could be used for the index
119 119 names = ro.r('names')
120 120
121 121 if dataframe:
122 122 as_data_frame = ro.r('as.data.frame')
123 123 cols = colnames(Robj)
124 124 _names = names(Robj)
125 125 if cols != ri.NULL:
126 126 Robj = as_data_frame(Robj)
127 127 names = tuple(np.array(cols))
128 128 elif _names != ri.NULL:
129 129 names = tuple(np.array(_names))
130 130 else: # failed to find names
131 131 return np.asarray(Robj)
132 132 Robj = np.rec.fromarrays(Robj, names = names)
133 133 return np.asarray(Robj)
134 134
135 135 @generic
136 136 def pyconverter(pyobj):
137 137 """Convert Python objects to R objects. Add types using the decorator:
138 138
139 139 @pyconverter.when_type
140 140 """
141 141 return pyobj
142 142
143 143 # The default conversion for lists seems to make them a nested list. That has
144 144 # some advantages, but is rarely convenient, so for interactive use, we convert
145 145 # lists to a numpy array, which becomes an R vector.
146 146 @pyconverter.when_type(list)
147 147 def pyconverter_list(pyobj):
148 148 return np.asarray(pyobj)
149 149
150 150 if pandas2ri is None:
151 151 # pandas2ri was new in rpy2 2.3.3, so for now we'll fallback to pandas'
152 152 # conversion function.
153 153 try:
154 154 from pandas import DataFrame
155 155 from pandas.rpy.common import convert_to_r_dataframe
156 156 @pyconverter.when_type(DataFrame)
157 157 def pyconverter_dataframe(pyobj):
158 158 return convert_to_r_dataframe(pyobj, strings_as_factors=True)
159 159 except ImportError:
160 160 pass
161 161
162 162 @magics_class
163 163 class RMagics(Magics):
164 164 """A set of magics useful for interactive work with R via rpy2.
165 165 """
166 166
167 167 def __init__(self, shell, Rconverter=Rconverter,
168 168 pyconverter=pyconverter,
169 169 cache_display_data=False):
170 170 """
171 171 Parameters
172 172 ----------
173 173
174 174 shell : IPython shell
175 175
176 176 Rconverter : callable
177 177 To be called on values taken from R before putting them in the
178 178 IPython namespace.
179 179
180 180 pyconverter : callable
181 181 To be called on values in ipython namespace before
182 182 assigning to variables in rpy2.
183 183
184 184 cache_display_data : bool
185 185 If True, the published results of the final call to R are
186 186 cached in the variable 'display_cache'.
187 187
188 188 """
189 189 super(RMagics, self).__init__(shell)
190 190 self.cache_display_data = cache_display_data
191 191
192 192 self.r = ro.R()
193 193
194 194 self.Rstdout_cache = []
195 195 self.pyconverter = pyconverter
196 196 self.Rconverter = Rconverter
197 197
198 198 def eval(self, line):
199 199 '''
200 200 Parse and evaluate a line of R code with rpy2.
201 201 Returns the output to R's stdout() connection,
202 202 the value generated by evaluating the code, and a
203 203 boolean indicating whether the return value would be
204 204 visible if the line of code were evaluated in an R REPL.
205 205
206 206 R Code evaluation and visibility determination are
207 207 done via an R call of the form withVisible({<code>})
208 208
209 209 '''
210 210 old_writeconsole = ri.get_writeconsole()
211 211 ri.set_writeconsole(self.write_console)
212 212 try:
213 213 res = ro.r("withVisible({%s\n})" % line)
214 214 value = res[0] #value (R object)
215 215 visible = ro.conversion.ri2py(res[1])[0] #visible (boolean)
216 216 except (ri.RRuntimeError, ValueError) as exception:
217 217 warning_or_other_msg = self.flush() # otherwise next return seems to have copy of error
218 218 raise RInterpreterError(line, str_to_unicode(str(exception)), warning_or_other_msg)
219 219 text_output = self.flush()
220 220 ri.set_writeconsole(old_writeconsole)
221 221 return text_output, value, visible
222 222
223 223 def write_console(self, output):
224 224 '''
225 225 A hook to capture R's stdout in a cache.
226 226 '''
227 227 self.Rstdout_cache.append(output)
228 228
229 229 def flush(self):
230 230 '''
231 231 Flush R's stdout cache to a string, returning the string.
232 232 '''
233 233 value = ''.join([str_to_unicode(s, 'utf-8') for s in self.Rstdout_cache])
234 234 self.Rstdout_cache = []
235 235 return value
236 236
237 237 @skip_doctest
238 238 @needs_local_scope
239 239 @line_magic
240 240 def Rpush(self, line, local_ns=None):
241 241 '''
242 242 A line-level magic for R that pushes
243 243 variables from python to rpy2. The line should be made up
244 244 of whitespace separated variable names in the IPython
245 245 namespace::
246 246
247 247 In [7]: import numpy as np
248 248
249 249 In [8]: X = np.array([4.5,6.3,7.9])
250 250
251 251 In [9]: X.mean()
252 252 Out[9]: 6.2333333333333343
253 253
254 254 In [10]: %Rpush X
255 255
256 256 In [11]: %R mean(X)
257 257 Out[11]: array([ 6.23333333])
258 258
259 259 '''
260 260 if local_ns is None:
261 261 local_ns = {}
262 262
263 263 inputs = line.split(' ')
264 264 for input in inputs:
265 265 try:
266 266 val = local_ns[input]
267 267 except KeyError:
268 268 try:
269 269 val = self.shell.user_ns[input]
270 270 except KeyError:
271 271 # reraise the KeyError as a NameError so that it looks like
272 272 # the standard python behavior when you use an unnamed
273 273 # variable
274 274 raise NameError("name '%s' is not defined" % input)
275 275
276 276 self.r.assign(input, self.pyconverter(val))
277 277
278 278 @skip_doctest
279 279 @magic_arguments()
280 280 @argument(
281 281 '-d', '--as_dataframe', action='store_true',
282 282 default=False,
283 283 help='Convert objects to data.frames before returning to ipython.'
284 284 )
285 285 @argument(
286 286 'outputs',
287 287 nargs='*',
288 288 )
289 289 @line_magic
290 290 def Rpull(self, line):
291 291 '''
292 292 A line-level magic for R that pulls
293 293 variables from python to rpy2::
294 294
295 295 In [18]: _ = %R x = c(3,4,6.7); y = c(4,6,7); z = c('a',3,4)
296 296
297 297 In [19]: %Rpull x y z
298 298
299 299 In [20]: x
300 300 Out[20]: array([ 3. , 4. , 6.7])
301 301
302 302 In [21]: y
303 303 Out[21]: array([ 4., 6., 7.])
304 304
305 305 In [22]: z
306 306 Out[22]:
307 307 array(['a', '3', '4'],
308 308 dtype='|S1')
309 309
310 310
311 311 If --as_dataframe, then each object is returned as a structured array
312 312 after first passed through "as.data.frame" in R before
313 313 being calling self.Rconverter.
314 314 This is useful when a structured array is desired as output, or
315 315 when the object in R has mixed data types.
316 316 See the %%R docstring for more examples.
317 317
318 318 Notes
319 319 -----
320 320
321 321 Beware that R names can have '.' so this is not fool proof.
322 322 To avoid this, don't name your R objects with '.'s...
323 323
324 324 '''
325 325 args = parse_argstring(self.Rpull, line)
326 326 outputs = args.outputs
327 327 for output in outputs:
328 328 self.shell.push({output:self.Rconverter(self.r(output),dataframe=args.as_dataframe)})
329 329
330 330 @skip_doctest
331 331 @magic_arguments()
332 332 @argument(
333 333 '-d', '--as_dataframe', action='store_true',
334 334 default=False,
335 335 help='Convert objects to data.frames before returning to ipython.'
336 336 )
337 337 @argument(
338 338 'output',
339 339 nargs=1,
340 340 type=str,
341 341 )
342 342 @line_magic
343 343 def Rget(self, line):
344 344 '''
345 345 Return an object from rpy2, possibly as a structured array (if possible).
346 346 Similar to Rpull except only one argument is accepted and the value is
347 347 returned rather than pushed to self.shell.user_ns::
348 348
349 349 In [3]: dtype=[('x', '<i4'), ('y', '<f8'), ('z', '|S1')]
350 350
351 351 In [4]: datapy = np.array([(1, 2.9, 'a'), (2, 3.5, 'b'), (3, 2.1, 'c'), (4, 5, 'e')], dtype=dtype)
352 352
353 353 In [5]: %R -i datapy
354 354
355 355 In [6]: %Rget datapy
356 356 Out[6]:
357 357 array([['1', '2', '3', '4'],
358 358 ['2', '3', '2', '5'],
359 359 ['a', 'b', 'c', 'e']],
360 360 dtype='|S1')
361 361
362 362 In [7]: %Rget -d datapy
363 363 Out[7]:
364 364 array([(1, 2.9, 'a'), (2, 3.5, 'b'), (3, 2.1, 'c'), (4, 5.0, 'e')],
365 365 dtype=[('x', '<i4'), ('y', '<f8'), ('z', '|S1')])
366 366
367 367 '''
368 368 args = parse_argstring(self.Rget, line)
369 369 output = args.output
370 370 return self.Rconverter(self.r(output[0]),dataframe=args.as_dataframe)
371 371
372 372
373 373 @skip_doctest
374 374 @magic_arguments()
375 375 @argument(
376 376 '-i', '--input', action='append',
377 377 help='Names of input variable from shell.user_ns to be assigned to R variables of the same names after calling self.pyconverter. Multiple names can be passed separated only by commas with no whitespace.'
378 378 )
379 379 @argument(
380 380 '-o', '--output', action='append',
381 381 help='Names of variables to be pushed from rpy2 to shell.user_ns after executing cell body and applying self.Rconverter. Multiple names can be passed separated only by commas with no whitespace.'
382 382 )
383 383 @argument(
384 384 '-w', '--width', type=int,
385 385 help='Width of png plotting device sent as an argument to *png* in R.'
386 386 )
387 387 @argument(
388 388 '-h', '--height', type=int,
389 389 help='Height of png plotting device sent as an argument to *png* in R.'
390 390 )
391 391
392 392 @argument(
393 393 '-d', '--dataframe', action='append',
394 394 help='Convert these objects to data.frames and return as structured arrays.'
395 395 )
396 396 @argument(
397 397 '-u', '--units', type=unicode_type, choices=["px", "in", "cm", "mm"],
398 398 help='Units of png plotting device sent as an argument to *png* in R. One of ["px", "in", "cm", "mm"].'
399 399 )
400 400 @argument(
401 401 '-r', '--res', type=int,
402 402 help='Resolution of png plotting device sent as an argument to *png* in R. Defaults to 72 if *units* is one of ["in", "cm", "mm"].'
403 403 )
404 404 @argument(
405 405 '-p', '--pointsize', type=int,
406 406 help='Pointsize of png plotting device sent as an argument to *png* in R.'
407 407 )
408 408 @argument(
409 409 '-b', '--bg',
410 410 help='Background of png plotting device sent as an argument to *png* in R.'
411 411 )
412 412 @argument(
413 413 '-n', '--noreturn',
414 414 help='Force the magic to not return anything.',
415 415 action='store_true',
416 416 default=False
417 417 )
418 418 @argument(
419 419 'code',
420 420 nargs='*',
421 421 )
422 422 @needs_local_scope
423 423 @line_cell_magic
424 424 def R(self, line, cell=None, local_ns=None):
425 425 '''
426 426 Execute code in R, and pull some of the results back into the Python namespace.
427 427
428 428 In line mode, this will evaluate an expression and convert the returned value to a Python object.
429 429 The return value is determined by rpy2's behaviour of returning the result of evaluating the
430 430 final line.
431 431
432 432 Multiple R lines can be executed by joining them with semicolons::
433 433
434 434 In [9]: %R X=c(1,4,5,7); sd(X); mean(X)
435 435 Out[9]: array([ 4.25])
436 436
437 437 In cell mode, this will run a block of R code. The resulting value
438 438 is printed if it would printed be when evaluating the same code
439 439 within a standard R REPL.
440 440
441 441 Nothing is returned to python by default in cell mode::
442 442
443 443 In [10]: %%R
444 444 ....: Y = c(2,4,3,9)
445 445 ....: summary(lm(Y~X))
446 446
447 447 Call:
448 448 lm(formula = Y ~ X)
449 449
450 450 Residuals:
451 451 1 2 3 4
452 452 0.88 -0.24 -2.28 1.64
453 453
454 454 Coefficients:
455 455 Estimate Std. Error t value Pr(>|t|)
456 456 (Intercept) 0.0800 2.3000 0.035 0.975
457 457 X 1.0400 0.4822 2.157 0.164
458 458
459 459 Residual standard error: 2.088 on 2 degrees of freedom
460 460 Multiple R-squared: 0.6993,Adjusted R-squared: 0.549
461 461 F-statistic: 4.651 on 1 and 2 DF, p-value: 0.1638
462 462
463 463 In the notebook, plots are published as the output of the cell::
464 464
465 465 %R plot(X, Y)
466 466
467 467 will create a scatter plot of X bs Y.
468 468
469 469 If cell is not None and line has some R code, it is prepended to
470 470 the R code in cell.
471 471
472 472 Objects can be passed back and forth between rpy2 and python via the -i -o flags in line::
473 473
474 474 In [14]: Z = np.array([1,4,5,10])
475 475
476 476 In [15]: %R -i Z mean(Z)
477 477 Out[15]: array([ 5.])
478 478
479 479
480 480 In [16]: %R -o W W=Z*mean(Z)
481 481 Out[16]: array([ 5., 20., 25., 50.])
482 482
483 483 In [17]: W
484 484 Out[17]: array([ 5., 20., 25., 50.])
485 485
486 486 The return value is determined by these rules:
487 487
488 488 * If the cell is not None, the magic returns None.
489 489
490 490 * If the cell evaluates as False, the resulting value is returned
491 491 unless the final line prints something to the console, in
492 492 which case None is returned.
493 493
494 494 * If the final line results in a NULL value when evaluated
495 495 by rpy2, then None is returned.
496 496
497 497 * No attempt is made to convert the final value to a structured array.
498 498 Use the --dataframe flag or %Rget to push / return a structured array.
499 499
500 500 * If the -n flag is present, there is no return value.
501 501
502 502 * A trailing ';' will also result in no return value as the last
503 503 value in the line is an empty string.
504 504
505 505 The --dataframe argument will attempt to return structured arrays.
506 506 This is useful for dataframes with
507 507 mixed data types. Note also that for a data.frame,
508 508 if it is returned as an ndarray, it is transposed::
509 509
510 510 In [18]: dtype=[('x', '<i4'), ('y', '<f8'), ('z', '|S1')]
511 511
512 512 In [19]: datapy = np.array([(1, 2.9, 'a'), (2, 3.5, 'b'), (3, 2.1, 'c'), (4, 5, 'e')], dtype=dtype)
513 513
514 514 In [20]: %%R -o datar
515 515 datar = datapy
516 516 ....:
517 517
518 518 In [21]: datar
519 519 Out[21]:
520 520 array([['1', '2', '3', '4'],
521 521 ['2', '3', '2', '5'],
522 522 ['a', 'b', 'c', 'e']],
523 523 dtype='|S1')
524 524
525 525 In [22]: %%R -d datar
526 526 datar = datapy
527 527 ....:
528 528
529 529 In [23]: datar
530 530 Out[23]:
531 531 array([(1, 2.9, 'a'), (2, 3.5, 'b'), (3, 2.1, 'c'), (4, 5.0, 'e')],
532 532 dtype=[('x', '<i4'), ('y', '<f8'), ('z', '|S1')])
533 533
534 534 The --dataframe argument first tries colnames, then names.
535 535 If both are NULL, it returns an ndarray (i.e. unstructured)::
536 536
537 537 In [1]: %R mydata=c(4,6,8.3); NULL
538 538
539 539 In [2]: %R -d mydata
540 540
541 541 In [3]: mydata
542 542 Out[3]: array([ 4. , 6. , 8.3])
543 543
544 544 In [4]: %R names(mydata) = c('a','b','c'); NULL
545 545
546 546 In [5]: %R -d mydata
547 547
548 548 In [6]: mydata
549 549 Out[6]:
550 550 array((4.0, 6.0, 8.3),
551 551 dtype=[('a', '<f8'), ('b', '<f8'), ('c', '<f8')])
552 552
553 553 In [7]: %R -o mydata
554 554
555 555 In [8]: mydata
556 556 Out[8]: array([ 4. , 6. , 8.3])
557 557
558 558 '''
559 559
560 560 args = parse_argstring(self.R, line)
561 561
562 562 # arguments 'code' in line are prepended to
563 563 # the cell lines
564 564
565 565 if cell is None:
566 566 code = ''
567 567 return_output = True
568 568 line_mode = True
569 569 else:
570 570 code = cell
571 571 return_output = False
572 572 line_mode = False
573 573
574 574 code = ' '.join(args.code) + code
575 575
576 576 # if there is no local namespace then default to an empty dict
577 577 if local_ns is None:
578 578 local_ns = {}
579 579
580 580 if args.input:
581 581 for input in ','.join(args.input).split(','):
582 582 try:
583 583 val = local_ns[input]
584 584 except KeyError:
585 585 try:
586 586 val = self.shell.user_ns[input]
587 587 except KeyError:
588 588 raise NameError("name '%s' is not defined" % input)
589 589 self.r.assign(input, self.pyconverter(val))
590 590
591 591 if getattr(args, 'units') is not None:
592 592 if args.units != "px" and getattr(args, 'res') is None:
593 593 args.res = 72
594 594 args.units = '"%s"' % args.units
595 595
596 596 png_argdict = dict([(n, getattr(args, n)) for n in ['units', 'res', 'height', 'width', 'bg', 'pointsize']])
597 597 png_args = ','.join(['%s=%s' % (o,v) for o, v in png_argdict.items() if v is not None])
598 598 # execute the R code in a temporary directory
599 599
600 600 tmpd = tempfile.mkdtemp()
601 601 self.r('png("%s/Rplots%%03d.png",%s)' % (tmpd.replace('\\', '/'), png_args))
602 602
603 603 text_output = ''
604 604 try:
605 605 if line_mode:
606 606 for line in code.split(';'):
607 607 text_result, result, visible = self.eval(line)
608 608 text_output += text_result
609 609 if text_result:
610 610 # the last line printed something to the console so we won't return it
611 611 return_output = False
612 612 else:
613 613 text_result, result, visible = self.eval(code)
614 614 text_output += text_result
615 615 if visible:
616 616 old_writeconsole = ri.get_writeconsole()
617 617 ri.set_writeconsole(self.write_console)
618 618 ro.r.show(result)
619 619 text_output += self.flush()
620 620 ri.set_writeconsole(old_writeconsole)
621 621
622 622 except RInterpreterError as e:
623 623 print(e.stdout)
624 624 if not e.stdout.endswith(e.err):
625 625 print(e.err)
626 626 rmtree(tmpd)
627 627 return
628 628 finally:
629 629 self.r('dev.off()')
630 630
631 631 # read out all the saved .png files
632 632
633 633 images = [open(imgfile, 'rb').read() for imgfile in glob("%s/Rplots*png" % tmpd)]
634 634
635 635 # now publish the images
636 636 # mimicking IPython/zmq/pylab/backend_inline.py
637 637 fmt = 'png'
638 638 mimetypes = { 'png' : 'image/png', 'svg' : 'image/svg+xml' }
639 639 mime = mimetypes[fmt]
640 640
641 641 # publish the printed R objects, if any
642 642
643 643 display_data = []
644 644 if text_output:
645 645 display_data.append(('RMagic.R', {'text/plain':text_output}))
646 646
647 647 # flush text streams before sending figures, helps a little with output
648 648 for image in images:
649 649 # synchronization in the console (though it's a bandaid, not a real sln)
650 650 sys.stdout.flush(); sys.stderr.flush()
651 651 display_data.append(('RMagic.R', {mime: image}))
652 652
653 653 # kill the temporary directory
654 654 rmtree(tmpd)
655 655
656 656 # try to turn every output into a numpy array
657 657 # this means that output are assumed to be castable
658 658 # as numpy arrays
659 659
660 660 if args.output:
661 661 for output in ','.join(args.output).split(','):
662 662 self.shell.push({output:self.Rconverter(self.r(output), dataframe=False)})
663 663
664 664 if args.dataframe:
665 665 for output in ','.join(args.dataframe).split(','):
666 666 self.shell.push({output:self.Rconverter(self.r(output), dataframe=True)})
667 667
668 668 for tag, disp_d in display_data:
669 669 publish_display_data(data=disp_d, source=tag)
670 670
671 671 # this will keep a reference to the display_data
672 672 # which might be useful to other objects who happen to use
673 673 # this method
674 674
675 675 if self.cache_display_data:
676 676 self.display_cache = display_data
677 677
678 678 # if in line mode and return_output, return the result as an ndarray
679 679 if return_output and not args.noreturn:
680 680 if result != ri.NULL:
681 681 return self.Rconverter(result, dataframe=False)
682 682
683 683 __doc__ = __doc__.format(
684 684 R_DOC = dedent(RMagics.R.__doc__),
685 685 RPUSH_DOC = dedent(RMagics.Rpush.__doc__),
686 686 RPULL_DOC = dedent(RMagics.Rpull.__doc__),
687 687 RGET_DOC = dedent(RMagics.Rget.__doc__)
688 688 )
689 689
690 690
691 691 def load_ipython_extension(ip):
692 692 """Load the extension in IPython."""
693 693 warnings.warn("The rmagic extension in IPython is deprecated in favour of "
694 "rpy2.ipython. If available, that will be loaded instead.")
694 "rpy2.ipython. If available, that will be loaded instead.\n"
695 "http://rpy.sourceforge.net/")
695 696 try:
696 697 import rpy2.ipython
697 698 except ImportError:
698 699 pass # Fall back to our own implementation for now
699 700 else:
700 701 return rpy2.ipython.load_ipython_extension(ip)
701 702
702 703 ip.register_magics(RMagics)
703 704 # Initialising rpy2 interferes with readline. Since, at this point, we've
704 705 # probably just loaded rpy2, we reset the delimiters. See issue gh-2759.
705 706 if ip.has_readline:
706 707 ip.readline.set_completer_delims(ip.readline_delims)
General Comments 0
You need to be logged in to leave comments. Login now