в RStudio (Server). Создаю дата фрейм df в R сессии. Запускаю через reticulate питон, пытаюсь в питоне изменить столбец в r.df (это уже объект pandas). Изменения не сохраняются. Создаю копию объекта r.df в питоне и успешно меняю столбец в копии. Далее записываю в r.df модифицированную копию. Возвращаюсь в окружение R. Дата фрейм df изменен. Почему не удается напрямую сделать эти изменения в r.df из питона?
P.S.: Конечно, сама задача по модификации столбца не требует двух языков. Задаю вопрос, чтобы лучше понять как работает связка R-Python через reticulate, поскольку при быстром поиске в Интернете ответа на свой вопрос не нашел.
library(dplyr)
library(reticulate)
df = data.frame(
col1 = letters[1:5]
)
df # initial dataframe
#> col1
#> 1 a
#> 2 b
#> 3 c
#> 4 d
#> 5 e
# reticulate::repl_python()
py_run_string("
# Trying to modify object in R environment from python
r.df[['col1']] = r.df[['col1']].replace(['a','b'],['A','B']) # replace lowercase a and b with uppercase A and B
")
df # object was not modified !
#> col1
#> 1 a
#> 2 b
#> 3 c
#> 4 d
#> 5 e
py_run_string("
# Copy to new object in python
df = r.df
# Manipulate with new object in python
df[['col1']] = df[['col1']].replace(['a','b'],['A','B']) # replace lowercase a and b with uppercase A and B
# Replace old object with new one
r.df = df
")
df # now object is modified
#> col1
#> 1 A
#> 2 B
#> 3 c
#> 4 d
#> 5 e
<sup>Created on 2023-07-22 with reprex v2.0.2</sup>
Пространства памяти R и python — разных процессов, поэтому недоступны друг другу. Только через передачи копии.
Но при этом почему-то можно заменить объект целиком.
потому что копируется объект при присвоении
Понятно, большое спасибо!
Обсуждают сегодня