-
Notifications
You must be signed in to change notification settings - Fork 16
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversion 'py2rpy' not defined for objects of type '<class 'numpy.ndarray'>' #50
Comments
Please check out the README section Usage from Jupyter |
Hmm, wait. If I wonder why it 1. tries to convert anything from Python to R and 2. doesn’t know about ndarray… Do you have the newest anndata2ri version installed? |
Yes, the newest anndata2ri version is already installed. I typed below: rpy2.rinterface_lib.callbacks.logger.setLevel(logging.ERROR)
pandas2ri.activate()
anndata2ri.activate()
%load_ext rpy2.ipython
plt.rcParams['figure.figsize']=(8,8) #rescale figures
sc.settings.verbosity = 3
sc.set_figure_params(dpi=130, dpi_save=300)
sc.logging.print_versions() Then I get: |
I need data to reproduce this with… Please create code that uses a built-in scanpy dataset (or no dataset), takes a short time to run, and still reproduces this. |
This is reproducible and occurs if Minimal code sampleimport scanpy as sc
import rpy2.robjects as ro
import rpy2.robjects.numpy2ri
import anndata2ri
anndata2ri.activate()
rpy2.robjects.numpy2ri.activate()
pbmc = sc.datasets.pbmc68k_reduced()
ro.globalenv['sce'] = pbmc Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/scottgigante/.local/lib/python3.6/site-packages/rpy2/robjects/environments.py", line 32, in __setitem__
robj = conversion.converter.py2rpy(value)
File "/usr/lib/python3.6/functools.py", line 807, in wrapper
return dispatch(args[0].__class__)(*args, **kw)
File "/home/scottgigante/.local/lib/python3.6/site-packages/anndata2ri/py2r.py", line 72, in py2rpy_anndata
metadata = ListVector(obj.uns.items())
File "/home/scottgigante/.local/lib/python3.6/site-packages/rpy2/robjects/vectors.py", line 641, in __init__
kv = [(str(k), conversion.py2rpy(v)) for k, v in tlist]
File "/home/scottgigante/.local/lib/python3.6/site-packages/rpy2/robjects/vectors.py", line 641, in <listcomp>
kv = [(str(k), conversion.py2rpy(v)) for k, v in tlist]
File "/usr/lib/python3.6/functools.py", line 807, in wrapper
return dispatch(args[0].__class__)(*args, **kw)
File "/home/scottgigante/.local/lib/python3.6/site-packages/rpy2/robjects/conversion.py", line 174, in _py2rpy
str(type(obj))
NotImplementedError: Conversion 'py2rpy' not defined for objects of type '<class 'numpy.ndarray'>' Versions
|
Ah! Well, I have absolutely no idea in what way that breaks things and how I can prevent it. For the time being, “don’t do that” might be a good fix. Thank you for investigating! |
Looks like the short answer is stop using |
Well, the problem is that IPython’s R magic only works with the global converter, no? |
Right, so for that specific application the solution is to activate numpy2ri before anndata2ri, but for all other purposes a shift to local converters is probably wise. |
@flying-sheep: There seems to be a parameter in %%R allowing to specify the converter called I'm having trouble getting it to work but I have no idea how all this conversion stuff works so maybe I'm doing something stupid. If anyone with better knowledge on the rpy2 local convertors could maybe check this out, that would be great. I have access to the localconverter: in Jupyter, running
So I'm missing how to make %%R see the local converter so it can be specified. But as I said, rpy2 and its convertors are beyond me. |
Maybe it just supports named variables, because it does something like Try |
I had the same error while attempting a conversion of a pandas DataFrame to and an r DataFrame: pandas_df_2_r = ro.conversion.py2rpy(pandas_df) This page suggested this instead: with localconverter(ro.default_converter + pandas2ri.converter):
pandas_df_2_r = ro.conversion.py2rpy(pandas_df) And it worked. |
Hi @flying-sheep, @scottgigante, and @satellite119, Sorry to ping everyone, but I do not understand why this is closed and what is the solution. I am having the same error as the original post. I tried activating numpy2ri before anndata2ri, or Can someone point me to the right direction? |
Did you try what @Kovenda proposed right above your comment? |
Hi @flying-sheep, thank you for replying. Yes, I tried. I first imported these import rpy2.robjects as ro
from rpy2.robjects.conversion import localconverter
from rpy2.robjects import pandas2ri and with localconverter(ro.default_converter + pandas2ri.converter):
rdata = ro.conversion.py2rpy(adata) results in ---------------------------------------------------------------------------
NotImplementedError Traceback (most recent call last)
Input In [10], in <cell line: 1>()
1 with localconverter(ro.default_converter + pandas2ri.converter):
----> 2 rdata = ro.conversion.py2rpy(adata)
File ~/miniconda3/envs/anndata2ri_pip/lib/python3.10/site-packages/rpy2/robjects/conversion.py:365, in _deprecated_py2rpy(obj)
362 def _deprecated_py2rpy(
363 obj: Any
364 ) -> _rinterface_capi.SupportsSEXP:
--> 365 return converter_ctx.get('converter').py2rpy(obj)
File ~/miniconda3/envs/anndata2ri_pip/lib/python3.10/functools.py:889, in singledispatch.<locals>.wrapper(*args, **kw)
885 if not args:
886 raise TypeError(f'{funcname} requires at least '
887 '1 positional argument')
--> 889 return dispatch(args[0].__class__)(*args, **kw)
File ~/miniconda3/envs/anndata2ri_pip/lib/python3.10/site-packages/rpy2/robjects/conversion.py:240, in _py2rpy(obj)
238 if isinstance(obj, _rinterface_capi.SupportsSEXP):
239 return obj
--> 240 raise NotImplementedError(
241 "Conversion 'py2rpy' not defined for objects of type '%s'" %
242 str(type(obj))
243 )
NotImplementedError: Conversion 'py2rpy' not defined for objects of type '<class 'anndata._core.anndata.AnnData'>' I also tried with localconverter(ro.default_converter + pandas2ri.converter + anndata2ri.converter):
rdata = ro.conversion.py2rpy(adata) with the error ---------------------------------------------------------------------------
NotImplementedError Traceback (most recent call last)
Input In [11], in <cell line: 1>()
1 with localconverter(ro.default_converter + pandas2ri.converter + anndata2ri.converter):
----> 2 rdata = ro.conversion.py2rpy(adata)
File ~/miniconda3/envs/anndata2ri_pip/lib/python3.10/site-packages/rpy2/robjects/conversion.py:365, in _deprecated_py2rpy(obj)
362 def _deprecated_py2rpy(
363 obj: Any
364 ) -> _rinterface_capi.SupportsSEXP:
--> 365 return converter_ctx.get('converter').py2rpy(obj)
File ~/miniconda3/envs/anndata2ri_pip/lib/python3.10/functools.py:889, in singledispatch.<locals>.wrapper(*args, **kw)
885 if not args:
886 raise TypeError(f'{funcname} requires at least '
887 '1 positional argument')
--> 889 return dispatch(args[0].__class__)(*args, **kw)
File ~/miniconda3/envs/anndata2ri_pip/lib/python3.10/site-packages/anndata2ri/py2r.py:73, in py2rpy_anndata(obj)
70 with localconverter(full_converter() + dict_converter):
71 metadata = ListVector(obj.uns.items())
---> 73 rd_args = {conv_name.scanpy2sce(k): mat_converter.py2rpy(obj.obsm[k]) for k in obj.obsm.keys()}
74 reduced_dims = s4v.SimpleList(**rd_args)
76 return sce.SingleCellExperiment(
77 assays=assays, rowData=row_data, colData=col_data, metadata=metadata, reducedDims=reduced_dims
78 )
File ~/miniconda3/envs/anndata2ri_pip/lib/python3.10/site-packages/anndata2ri/py2r.py:73, in <dictcomp>(.0)
70 with localconverter(full_converter() + dict_converter):
71 metadata = ListVector(obj.uns.items())
---> 73 rd_args = {conv_name.scanpy2sce(k): mat_converter.py2rpy(obj.obsm[k]) for k in obj.obsm.keys()}
74 reduced_dims = s4v.SimpleList(**rd_args)
76 return sce.SingleCellExperiment(
77 assays=assays, rowData=row_data, colData=col_data, metadata=metadata, reducedDims=reduced_dims
78 )
File ~/miniconda3/envs/anndata2ri_pip/lib/python3.10/functools.py:889, in singledispatch.<locals>.wrapper(*args, **kw)
885 if not args:
886 raise TypeError(f'{funcname} requires at least '
887 '1 positional argument')
--> 889 return dispatch(args[0].__class__)(*args, **kw)
File ~/miniconda3/envs/anndata2ri_pip/lib/python3.10/site-packages/rpy2/robjects/numpy2ri.py:129, in nonnumpy2rpy(obj)
127 if not isinstance(obj, numpy.ndarray) and hasattr(obj, '__array__'):
128 obj = obj.__array__()
--> 129 return ro.default_converter.py2rpy(obj)
130 elif original_converter is None:
131 # This means that the conversion module was not "activated".
132 # For now, go with the default_converter.
133 # TODO: the conversion system needs an overhaul badly.
134 return ro.default_converter.py2rpy(obj)
File ~/miniconda3/envs/anndata2ri_pip/lib/python3.10/functools.py:889, in singledispatch.<locals>.wrapper(*args, **kw)
885 if not args:
886 raise TypeError(f'{funcname} requires at least '
887 '1 positional argument')
--> 889 return dispatch(args[0].__class__)(*args, **kw)
File ~/miniconda3/envs/anndata2ri_pip/lib/python3.10/site-packages/rpy2/robjects/conversion.py:240, in _py2rpy(obj)
238 if isinstance(obj, _rinterface_capi.SupportsSEXP):
239 return obj
--> 240 raise NotImplementedError(
241 "Conversion 'py2rpy' not defined for objects of type '%s'" %
242 str(type(obj))
243 )
NotImplementedError: Conversion 'py2rpy' not defined for objects of type '<class 'numpy.ndarray'>' It might be my inexperience with converters, but I got stuck at this point. Thanks! |
Hi, I solved the issue Give it a try. |
I just downgraded them, problem persists. |
What if you try them all? with localconverter(ro.default_converter + numpy2ri.converter + pandas2ri.converter + anndata2ri.converter):
sce = ro.conversion.py2rpy(adata) |
Importing them all with import rpy2.robjects as ro
from rpy2.robjects.conversion import localconverter
from rpy2.robjects import pandas2ri
import rpy2.robjects.numpy2ri as numpy2ri and with localconverter(ro.default_converter + numpy2ri.converter + pandas2ri.converter + anndata2ri.converter):
rdata = ro.conversion.py2rpy(adata) results in ---------------------------------------------------------------------------
NotImplementedError Traceback (most recent call last)
Input In [8], in <cell line: 1>()
1 with localconverter(ro.default_converter + numpy2ri.converter + pandas2ri.converter + anndata2ri.converter):
----> 2 rdata = ro.conversion.py2rpy(adata)
File ~/miniconda3/envs/anndata2ri_pip/lib/python3.10/functools.py:889, in singledispatch.<locals>.wrapper(*args, **kw)
885 if not args:
886 raise TypeError(f'{funcname} requires at least '
887 '1 positional argument')
--> 889 return dispatch(args[0].__class__)(*args, **kw)
File ~/miniconda3/envs/anndata2ri_pip/lib/python3.10/site-packages/anndata2ri/py2r.py:74, in py2rpy_anndata(obj)
71 with localconverter(full_converter() + dict_converter):
72 metadata = ListVector(obj.uns.items())
---> 74 rd_args = {conv_name.scanpy2sce(k): mat_converter.py2rpy(obj.obsm[k]) for k in obj.obsm.keys()}
75 reduced_dims = s4v.SimpleList(**rd_args)
77 return sce.SingleCellExperiment(
78 assays=assays, rowData=row_data, colData=col_data, metadata=metadata, reducedDims=reduced_dims
79 )
File ~/miniconda3/envs/anndata2ri_pip/lib/python3.10/site-packages/anndata2ri/py2r.py:74, in <dictcomp>(.0)
71 with localconverter(full_converter() + dict_converter):
72 metadata = ListVector(obj.uns.items())
---> 74 rd_args = {conv_name.scanpy2sce(k): mat_converter.py2rpy(obj.obsm[k]) for k in obj.obsm.keys()}
75 reduced_dims = s4v.SimpleList(**rd_args)
77 return sce.SingleCellExperiment(
78 assays=assays, rowData=row_data, colData=col_data, metadata=metadata, reducedDims=reduced_dims
79 )
File ~/miniconda3/envs/anndata2ri_pip/lib/python3.10/functools.py:889, in singledispatch.<locals>.wrapper(*args, **kw)
885 if not args:
886 raise TypeError(f'{funcname} requires at least '
887 '1 positional argument')
--> 889 return dispatch(args[0].__class__)(*args, **kw)
File ~/miniconda3/envs/anndata2ri_pip/lib/python3.10/site-packages/rpy2/robjects/numpy2ri.py:128, in nonnumpy2rpy(obj)
126 if not isinstance(obj, numpy.ndarray) and hasattr(obj, '__array__'):
127 obj = obj.__array__()
--> 128 return ro.default_converter.py2rpy(obj)
129 elif original_converter is None:
130 # This means that the conversion module was not "activated".
131 # For now, go with the default_converter.
132 # TODO: the conversion system needs an overhaul badly.
133 return ro.default_converter.py2rpy(obj)
File ~/miniconda3/envs/anndata2ri_pip/lib/python3.10/functools.py:889, in singledispatch.<locals>.wrapper(*args, **kw)
885 if not args:
886 raise TypeError(f'{funcname} requires at least '
887 '1 positional argument')
--> 889 return dispatch(args[0].__class__)(*args, **kw)
File ~/miniconda3/envs/anndata2ri_pip/lib/python3.10/site-packages/rpy2/robjects/conversion.py:188, in _py2rpy(obj)
186 if isinstance(obj, _rinterface_capi.SupportsSEXP):
187 return obj
--> 188 raise NotImplementedError(
189 "Conversion 'py2rpy' not defined for objects of type '%s'" %
190 str(type(obj))
191 )
NotImplementedError: Conversion 'py2rpy' not defined for objects of type '<class 'numpy.ndarray'>' |
Hi @flying-sheep, @rimelof. Sometimes I have the same issue, and it seems, that in particular cases the porblem in
results in
But it works if
works fine. I found out that it was due to |
Ha, that’s an actual lead! |
Well, I still can’t reproduce this. Can you modify the below minimal reproducer until it actually reproduces the problem? I obviously can’t go from your code since you didn’t define what import rpy2
import rpy2.robjects as ro
from rpy2.robjects.conversion import localconverter
import numpy as np
import anndata2ri
from anndata import AnnData
with localconverter(anndata2ri.converter):
ro.globalenv["adata_tmp"] = AnnData(
X=np.array([[1,2],[3,4]]),
obsm=dict(a=np.array([[5,6,7],[8,9,0]])),
) |
Thank you that’s great! This is the minimal reproducible example I was looking for: import pandas as pd
import numpy as np
from anndata import AnnData
import rpy2.robjects as ro
from rpy2.robjects.conversion import localconverter
import anndata2ri
adata_obsm_pd = AnnData(
X=np.array([[1,2],[3,4]]),
obs=dict(obs_names=['a','b']),
obsm=dict(a=pd.DataFrame([[5,6,7],[8,9,0]], index=['a','b'])),
)
with localconverter(anndata2ri.converter):
ro.globalenv["adata_obsm_pd"] = adata_obsm_pd |
Two additional tips for anyone who makes it to this thread and finds a dead end.
After doing that I was able to pull the adata object into R without any issues. |
Hello, I encountered a problem when I tried to run Slingshot following the scripts for "Current best-practices in single-cell RNA-seq: a tutorial".
Then the problem is
Do you know how to solve this problem?
Thank you
The text was updated successfully, but these errors were encountered: