python-3.x - %R 魔法输入参数在 Jupyter Notebook 中无法正常工作

标签 python-3.x rpy2

当我将 pandas DataFrame 作为输入参数传递给 magic line 时,出现错误。

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

下面粘贴的是我将 pandas df 作为输入传递给魔法单元的完整代码。

我在 Windows 10 上运行我的代码。我有 2019.10 Windows 64 位版本的 Anaconda。这些软件包具有以下版本 - rpy2 - 2.9.4、python - 3.6.9、jupyter - 1.0.0、pandas - 0.25.2。

我最近在我的电脑上重新安装了 anaconda。我安装了相同的软件包,但与过去的版本不同。我没有什么我以前版本的包在哪里。我的代码在重新安装之前可以正常工作。下面的代码是一个示例,但是

在我运行 magic cell 之后,我得到了错误。

%%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

最佳答案

我刚遇到这个问题。由于 numpy update,这似乎是一个错误.经过调查,错误来自将数据帧中的字符串传递给 R。解决此问题的最简单方法是简单地 update rpy2 to version 3.1 .

从你的系统中删除 rpy2

conda remove rpy2

现在重新安装

conda install -c conda-forge rpy2

关于python-3.x - %R 魔法输入参数在 Jupyter Notebook 中无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58561333/

相关文章:

python - 关于Python使用的疑问——六大模块

python - 如何将 urllib 响应写入文件

python - 在 IPython 笔记本上使用 rpy2?

python - rpy2 找不到包含目录

python - 在 Anaconda Jupyter Notebook (MAC OSX) 中加载 rpy2 时出现导入错误

Python:添加一个新的 mimetype

python - 来自带有 matplotlib 和 cx_Freeze 的 ctypes 的 NotADirectoryError

python-3.x - 让 PyC​​harm 将字符串识别为路径

Python 和 Rpy2 : Calling plot function with options that have "." in them

python - 使用 rpy2 : cannot find R package that is installed