anndata2ri icon indicating copy to clipboard operation
anndata2ri copied to clipboard

Conversion 'py2rpy' not defined for objects of type '<class 'numpy.ndarray'>'

Open satellite119 opened this issue 4 years ago • 24 comments

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".

%%R -i adata

#Plot 1
colour_map = brewer.pal(20,'Set1')
par(xpd=TRUE)
par(mar=c(4.5,5.5,2,7))
plot(reducedDims(adata)$PCA[,1], reducedDims(adata)$PCA[,2], col=colour_map[colData(adata)$louvain_r0.8], bty='L', xlab='PC1', ylab='PC2')
legend(x=12, y=12, legend=unique(colData(adata)$louvain_r0.8), fill=colour_map[as.integer(unique(colData(adata)$louvain_r0.8))])

print("1:")
adata_start <- slingshot(adata, clusterLabels = 'louvain_r0.8', reducedDim = 'PCA', start.clus='qHSC')
print(SlingshotDataSet(adata_start))

Then the problem is

NotImplementedError                       Traceback (most recent call last)
<ipython-input-49-f2b65708de9e> in <module>
----> 1 get_ipython().run_cell_magic('R', '-i adata', '\n#Plot 1\ncolour_map = brewer.pal(20,\'Set1\')\npar(xpd=TRUE)\npar(mar=c(4.5,5.5,2,7))\nplot(reducedDims(adata)$PCA[,1], reducedDims(adata)$PCA[,2], col=colour_map[colData(adata)$louvain_r0.8], bty=\'L\', xlab=\'PC1\', ylab=\'PC2\')\nlegend(x=12, y=12, legend=unique(colData(adata)$louvain_r0.8), fill=colour_map[as.integer(unique(colData(adata)$louvain_r0.8))])\n\nprint("1:")\nadata_start <- slingshot(adata, clusterLabels = \'louvain_r0.8\', reducedDim = \'PCA\', start.clus=\'qHSC\')\nprint(SlingshotDataSet(adata_start))\n')

~/.conda/envs/scanpy/lib/python3.8/site-packages/IPython/core/interactiveshell.py in run_cell_magic(self, magic_name, line, cell)
   2369             with self.builtin_trap:
   2370                 args = (magic_arg_s, cell)
-> 2371                 result = fn(*args, **kwargs)
   2372             return result
   2373 

<decorator-gen-130> in R(self, line, cell, local_ns)

~/.conda/envs/scanpy/lib/python3.8/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):

~/.conda/envs/scanpy/lib/python3.8/site-packages/rpy2/ipython/rmagic.py in R(self, line, cell, local_ns)
    735                         raise NameError("name '%s' is not defined" % input)
    736                 with localconverter(converter) as cv:
--> 737                     ro.r.assign(input, val)
    738 
    739         if args.display:

~/.conda/envs/scanpy/lib/python3.8/site-packages/rpy2/robjects/functions.py in __call__(self, *args, **kwargs)
    195                 v = kwargs.pop(k)
    196                 kwargs[r_k] = v
--> 197         return (super(SignatureTranslatedFunction, self)
    198                 .__call__(*args, **kwargs))
    199 

~/.conda/envs/scanpy/lib/python3.8/site-packages/rpy2/robjects/functions.py in __call__(self, *args, **kwargs)
    115 
    116     def __call__(self, *args, **kwargs):
--> 117         new_args = [conversion.py2rpy(a) for a in args]
    118         new_kwargs = {}
    119         for k, v in kwargs.items():

~/.conda/envs/scanpy/lib/python3.8/site-packages/rpy2/robjects/functions.py in <listcomp>(.0)
    115 
    116     def __call__(self, *args, **kwargs):
--> 117         new_args = [conversion.py2rpy(a) for a in args]
    118         new_kwargs = {}
    119         for k, v in kwargs.items():

~/.conda/envs/scanpy/lib/python3.8/functools.py in wrapper(*args, **kw)
    873                             '1 positional argument')
    874 
--> 875         return dispatch(args[0].__class__)(*args, **kw)
    876 
    877     funcname = getattr(func, '__name__', 'singledispatch function')

~/.conda/envs/scanpy/lib/python3.8/site-packages/anndata2ri/py2r.py in py2rpy_anndata(obj)
     69         # Convert everything we know
     70         with localconverter(full_converter() + dict_converter):
---> 71             metadata = ListVector(obj.uns.items())
     72 
     73         rd_args = {conv_name.scanpy2sce(k): mat_converter.py2rpy(obj.obsm[k]) for k in obj.obsm.keys()}

~/.conda/envs/scanpy/lib/python3.8/site-packages/rpy2/robjects/vectors.py in __init__(self, tlist)
    639                 raise ValueError('tlist should have a /method/ __iter__ '
    640                                  '(not an attribute)')
--> 641             kv = [(str(k), conversion.py2rpy(v)) for k, v in tlist]
    642             kv = tuple(kv)
    643             df = baseenv_ri.find("list").rcall(kv, globalenv_ri)

~/.conda/envs/scanpy/lib/python3.8/site-packages/rpy2/robjects/vectors.py in <listcomp>(.0)
    639                 raise ValueError('tlist should have a /method/ __iter__ '
    640                                  '(not an attribute)')
--> 641             kv = [(str(k), conversion.py2rpy(v)) for k, v in tlist]
    642             kv = tuple(kv)
    643             df = baseenv_ri.find("list").rcall(kv, globalenv_ri)

~/.conda/envs/scanpy/lib/python3.8/functools.py in wrapper(*args, **kw)
    873                             '1 positional argument')
    874 
--> 875         return dispatch(args[0].__class__)(*args, **kw)
    876 
    877     funcname = getattr(func, '__name__', 'singledispatch function')

~/.conda/envs/scanpy/lib/python3.8/site-packages/rpy2/robjects/conversion.py in _py2rpy(obj)
    170     objects.
    171     """
--> 172     raise NotImplementedError(
    173         "Conversion 'py2rpy' not defined for objects of type '%s'" %
    174         str(type(obj))

NotImplementedError: Conversion 'py2rpy' not defined for objects of type '<class 'numpy.ndarray'>'

Do you know how to solve this problem? Thank you

satellite119 avatar Aug 10 '20 15:08 satellite119

Please check out the README section Usage from Jupyter

flying-sheep avatar Aug 14 '20 08:08 flying-sheep

Hmm, wait. If %%R -i adata worked, then you have already activated everything correctly.

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?

flying-sheep avatar Aug 14 '20 08:08 flying-sheep

Hmm, wait. If %%R -i adata worked, then you have already activated everything correctly.

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: scanpy==1.5.1 anndata==0.7.4 umap==0.4.6 numpy==1.19.0 scipy==1.5.1 pandas==1.0.5 scikit-learn==0.23.1 statsmodels==0.11.1 python-igraph==0.8.2 louvain==0.6.1

satellite119 avatar Aug 14 '20 20:08 satellite119

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.

flying-sheep avatar Aug 19 '20 20:08 flying-sheep

This is reproducible and occurs if numpy2ri.activate() is called after anndata2ri.activate().

Minimal code sample

import 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

>>> sc.logging.print_versions()
scanpy==1.4.6 anndata==0.7.3 umap==0.4.6 numpy==1.19.1 scipy==1.5.2 pandas==1.0.5 scikit-learn==0.23.1 statsmodels==0.11.1 python-igraph==0.8.2 louvain==0.6.0
>>> anndata2ri.__version__
'1.0.5.dev2+ea266ab'
>>> rpy2.__version__
'3.3.6'
>>> sys.version_info
sys.version_info(major=3, minor=6, micro=9, releaselevel='final', serial=0)

scottgigante avatar Oct 29 '20 21:10 scottgigante

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! :relaxed:

flying-sheep avatar Oct 30 '20 21:10 flying-sheep

Looks like the short answer is stop using .activate. See https://github.com/rpy2/rpy2/blob/master/rpy2/robjects/numpy2ri.py#L182

scottgigante avatar Oct 30 '20 21:10 scottgigante

Well, the problem is that IPython’s R magic only works with the global converter, no?

flying-sheep avatar Oct 30 '20 21:10 flying-sheep

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.

scottgigante avatar Nov 02 '20 16:11 scottgigante

Well, the problem is that IPython’s R magic only works with the global converter, no?

@flying-sheep: There seems to be a parameter in %%R allowing to specify the converter called --converter. See https://rpy2.github.io/doc/latest/html/interactive.html#rmagic

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 anndata2ri.converter in a cell outputs <rpy2.robjects.conversion.Converter at 0x7fa923c96d00> but when I try the command

%%R -i adata_test --converter anndata2ri.converter, I get the error NameError: name 'anndata2ri.converter' is not defined

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.

kehey avatar Nov 21 '20 22:11 kehey

Maybe it just supports named variables, because it does something like globals()[converter_name]?

Try from anndata2ri import converter and using it like that.

flying-sheep avatar Nov 22 '20 20:11 flying-sheep

I had the same error while attempting a conversion of a pandas DataFrame to and an r DataFrame: Here was the fix: Instead of simply saying:

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.

Kovenda avatar Jul 18 '22 14:07 Kovenda

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 %%R -i mapped_spatial --converter anndata2ri.converter and also from anndata2ri import converter, with the respective errors described above.

Can someone point me to the right direction? Thanks!

rimelof avatar Jul 28 '22 21:07 rimelof

Did you try what @Kovenda proposed right above your comment?

flying-sheep avatar Jul 29 '22 08:07 flying-sheep

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!

rimelof avatar Jul 29 '22 13:07 rimelof

Hi, I solved the issue NotImplementedError: Conversion 'py2rpy' not defined for objects of type '<class 'numpy.ndarray'>' by downgrade packages: rpy2==3.4.2 anndata2ri==1.0.6

Give it a try.

m21camby avatar Jul 29 '22 13:07 m21camby

I just downgraded them, problem persists.

rimelof avatar Jul 29 '22 13:07 rimelof

What if you try them all?

with localconverter(ro.default_converter + numpy2ri.converter + pandas2ri.converter + anndata2ri.converter):
    sce = ro.conversion.py2rpy(adata)

flying-sheep avatar Jul 29 '22 14:07 flying-sheep

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

rimelof avatar Jul 29 '22 16:07 rimelof

Hi @flying-sheep, @rimelof.

Sometimes I have the same issue, and it seems, that in particular cases the porblem in adata.obsm. Here is an example.

adata_tmp = sc.AnnData(
    X=adata.X,
    obs=adata.obs,
    var=adata.var,
    uns=adata.uns,
    obsm=adata.obsm,
    obsp=adata.obsp,
    layers=adata.layers,
)
ro.globalenv["adata_tmp"] = adata_tmp

results in

...
NotImplementedError: Conversion 'py2rpy' not defined for objects of type '<class 'numpy.ndarray'>'

But it works if adata_tmp doesn't include adata.obsm.

adata_tmp = sc.AnnData(
    X=adata.X,
    obs=adata.obs,
    var=adata.var,
    uns=adata.uns,
    obsp=adata.obsp,
    layers=adata.layers,
)
ro.globalenv["adata_tmp"] = adata_tmp

works fine.

I found out that it was due to adata.obsm['mlm_estimate'] (output of Decoupler package), there was a pandas DataFrame, not np.array.

serjisa avatar Oct 24 '22 16:10 serjisa

Ha, that’s an actual lead!

flying-sheep avatar Oct 26 '22 08:10 flying-sheep

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 adata is.

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]])),
    )

flying-sheep avatar Oct 26 '22 08:10 flying-sheep

Check Google Colab: https://colab.research.google.com/drive/1ywI3_QLOFddpw9edtNpK6-o_YA6l1kWM?usp=sharing

serjisa avatar Oct 26 '22 09:10 serjisa

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

flying-sheep avatar Oct 26 '22 09:10 flying-sheep

Two additional tips for anyone who makes it to this thread and finds a dead end.

  1. Ensure all of the dtypes on any pandas dataframe within your anndata object are NOT object type. In my case this was casting multiple columns in adata.obs to category type
  2. Cast any numpy.ndarray objects within your anndata object to scipy.sparse.csc_matrix. In my case this was adata.X and adata.X_pca after running PCA.

After doing that I was able to pull the adata object into R without any issues.

sfederow-velia avatar May 19 '23 20:05 sfederow-velia