Волшебный входной аргумент% R не работает должным образом в блокноте Jupyter - PullRequest
1 голос
/ 25 октября 2019

Когда я передаю pandas DataFrame в качестве входного аргумента в магическую строку, я получаю сообщение об ошибке.

%R -i df
ValueError: Buffer for this type not yet supported.

Ниже приведен полный код, в котором я передаю pandas df в качестве ввода в магическую ячейку.

Я выполняю свой код на Windows 10. У меня есть версия Anaconda для Windows 649-разрядной версии 2019.10. Пакеты имеют следующие версии - rpy2 - 2.9.4, python - 3.6.9, jupyter - 1.0.0, pandas - 0.25.2.

Я недавно переустановил anaconda на свой компьютер. У меня установлены те же пакеты, но разные версии из прошлого. Я не то, что моя предыдущая версия пакетов, где. Мой код работал до переустановки. Приведенный ниже код является примером, но

После того, как я запустил волшебную ячейку, я получаю ошибку.

%%R -i df
df$index <- as.numeric(row.names(df))
library(ggplot2)
ggplot(data = df, aes(x = index)) + 
    geom_line(aes(y = col1, color = 'col1'), size = 0.5) + 
    geom_line(aes(y = col2, color = 'col2'), size = 0.5)

ValueError: Buffer for this type not yet supported.

Теперь я возвращаюсь к той же ячейке и удаляю входной аргумент и повторно запускаюэто снова, и я получаю желаемый результат без каких-либо ошибок.

%%R
df$index <- as.numeric(row.names(df))
library(ggplot2)
ggplot(data = df, aes(x = index)) + 
    geom_line(aes(y = col1, color = 'col1'), size = 0.5) + 
    geom_line(aes(y = col2, color = 'col2'), size = 0.5)

Ниже приведен полный код.

--> import pandas as pd
df = pd.DataFrame({'col1': [1, 2, 3, 4], 'col2': [5, 6, 7, 8], 'col3': ['a','b','a','b']})
df

-- >%load_ext rpy2.ipython

--> %%R -i df
df$index <- as.numeric(row.names(df))
library(ggplot2)
ggplot(data = df, aes(x = index)) + 
    geom_line(aes(y = col1, color = 'col1'), size = 0.5) + 
    geom_line(aes(y = col2, color = 'col2'), size = 0.5)

Я ожидал, что R magic сработает, чтобы я смог построить свои данныеиспользуя ggplot2, как это было до моей переустановки anaconda.

Ниже приведена ошибка.

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-57-4a5dfe23f86a> in <module>
----> 1 get_ipython().run_cell_magic('R', '-i df', "df$index <- as.numeric(row.names(df))\nlibrary(ggplot2)\nggplot(data = df, aes(x = index)) + \n    geom_line(aes(y = col1, color = 'col1'), size = 0.5) + \n    geom_line(aes(y = col2, color = 'col2'), size = 0.5)\n")

C:\Anaconda3\envs\keras\lib\site-packages\IPython\core\interactiveshell.py in run_cell_magic(self, magic_name, line, cell)
   2357             with self.builtin_trap:
   2358                 args = (magic_arg_s, cell)
-> 2359                 result = fn(*args, **kwargs)
   2360             return result
   2361 

<C:\Anaconda3\envs\keras\lib\site-packages\decorator.py:decorator-gen-131> in R(self, line, cell, local_ns)

C:\Anaconda3\envs\keras\lib\site-packages\IPython\core\magic.py in <lambda>(f, *a, **k)
    185     # but it's overkill for just that one bit of state.
    186     def magic_deco(arg):
--> 187         call = lambda f, *a, **k: f(*a, **k)
    188 
    189         if callable(arg):

C:\Anaconda3\envs\keras\lib\site-packages\rpy2\ipython\rmagic.py in R(self, line, cell, local_ns)
    688                         raise NameError("name '%s' is not defined" % input)
    689                 with localconverter(converter) as cv:
--> 690                     ro.r.assign(input, val)
    691 
    692         tmpd = self.setup_graphics(args)

C:\Anaconda3\envs\keras\lib\site-packages\rpy2\robjects\functions.py in __call__(self, *args, **kwargs)
    176                 v = kwargs.pop(k)
    177                 kwargs[r_k] = v
--> 178         return super(SignatureTranslatedFunction, self).__call__(*args, **kwargs)
    179 
    180 pattern_link = re.compile(r'\\link\{(.+?)\}')

C:\Anaconda3\envs\keras\lib\site-packages\rpy2\robjects\functions.py in __call__(self, *args, **kwargs)
    105             new_kwargs[k] = conversion.py2ri(v)
    106         res = super(Function, self).__call__(*new_args, **new_kwargs)
--> 107         res = conversion.ri2ro(res)
    108         return res
    109 

C:\Anaconda3\envs\keras\lib\functools.py in wrapper(*args, **kw)
    805                             '1 positional argument')
    806 
--> 807         return dispatch(args[0].__class__)(*args, **kw)
    808 
    809     funcname = getattr(func, '__name__', 'singledispatch function')

C:\Anaconda3\envs\keras\lib\site-packages\rpy2\ipython\rmagic.py in _(obj)
    147     if 'data.frame' in obj.rclass:
    148         # request to turn it to a pandas DataFrame
--> 149         res = converter.ri2py(obj)
    150     else:
    151         res = ro.sexpvector_to_ro(obj)

C:\Anaconda3\envs\keras\lib\functools.py in wrapper(*args, **kw)
    805                             '1 positional argument')
    806 
--> 807         return dispatch(args[0].__class__)(*args, **kw)
    808 
    809     funcname = getattr(func, '__name__', 'singledispatch function')

C:\Anaconda3\envs\keras\lib\site-packages\rpy2\robjects\pandas2ri.py in ri2py_listvector(obj)
    181 def ri2py_listvector(obj):
    182     if 'data.frame' in obj.rclass:
--> 183         res = ri2py(DataFrame(obj))
    184     else:
    185         res = numpy2ri.ri2py(obj)

C:\Anaconda3\envs\keras\lib\functools.py in wrapper(*args, **kw)
    805                             '1 positional argument')
    806 
--> 807         return dispatch(args[0].__class__)(*args, **kw)
    808 
    809     funcname = getattr(func, '__name__', 'singledispatch function')

C:\Anaconda3\envs\keras\lib\site-packages\rpy2\robjects\pandas2ri.py in ri2py_dataframe(obj)
    188 @ri2py.register(DataFrame)
    189 def ri2py_dataframe(obj):
--> 190     items = tuple((k, ri2py(v)) for k, v in obj.items())
    191     res = PandasDataFrame.from_items(items)
    192     return res

C:\Anaconda3\envs\keras\lib\site-packages\rpy2\robjects\pandas2ri.py in <genexpr>(.0)
    188 @ri2py.register(DataFrame)
    189 def ri2py_dataframe(obj):
--> 190     items = tuple((k, ri2py(v)) for k, v in obj.items())
    191     res = PandasDataFrame.from_items(items)
    192     return res

C:\Anaconda3\envs\keras\lib\functools.py in wrapper(*args, **kw)
    805                             '1 positional argument')
    806 
--> 807         return dispatch(args[0].__class__)(*args, **kw)
    808 
    809     funcname = getattr(func, '__name__', 'singledispatch function')

C:\Anaconda3\envs\keras\lib\site-packages\rpy2\robjects\pandas2ri.py in ri2py_vector(obj)
    137 @ri2py.register(SexpVector)
    138 def ri2py_vector(obj):
--> 139     res = numpy2ri.ri2py(obj)
    140     return res
    141 

C:\Anaconda3\envs\keras\lib\functools.py in wrapper(*args, **kw)
    805                             '1 positional argument')
    806 
--> 807         return dispatch(args[0].__class__)(*args, **kw)
    808 
    809     funcname = getattr(func, '__name__', 'singledispatch function')

C:\Anaconda3\envs\keras\lib\site-packages\rpy2\robjects\numpy2ri.py in ri2py_sexp(obj)
    157 def ri2py_sexp(obj):
    158     if (obj.typeof in _vectortypes) and (obj.typeof != VECSXP):
--> 159         res = numpy.asarray(obj)
    160     else:
    161         res = ro.default_converter.ri2py(obj)

C:\Anaconda3\envs\keras\lib\site-packages\numpy\core\numeric.py in asarray(a, dtype, order)
    536 
    537     """
--> 538     return array(a, dtype, copy=False, order=order)
    539 
    540 

ValueError: Buffer for this type not yet supported.

Jupyter notebook

1 Ответ

0 голосов
/ 14 ноября 2019

Я только столкнулся с этой проблемой. Кажется, это ошибка из-за numpy update . После расследования ошибка возникает из-за передачи строк в фреймах данных в R. Самый простой способ исправить это - просто обновить rpy2 до версии 3.1 .

Удалите rpy2 из вашей системы

conda remove rpy2

Теперь переустановите

conda install -c conda-forge rpy2
...