¿Cómo construir una función de estilo lapply en R con código Python dentro con el paquete reticulate?

CorePress2024-01-25  12

Construí una función de traducción simple en R con código Python dentro. Funciona bien para una cuerda. Pero, ¿cómo debería aplicarse para una lista de cadenas?

string <- c("cat")
string <- c("cat", "dog")
translations.df <- TranslateEnglishStringToFrenchString(string)
View(translations.df)

TranslateEnglishStringToFrenchString <- function(string){
  functionToApply <- function(string){
    reticulate::py_run_string("from deep_translator import GoogleTranslator")
    reticulate::py_run_string("translatedString = GoogleTranslator(source='en', target='fr').translate(r.string)")
    translatedString <- py$translatedString
    .df <- data.frame(string, translatedString)
    return(.df)
  }
  toReturn.df <- do.call(rbind, lapply(string, functionToApply))
  return(toReturn.df)
}

Por el momento devuelve el siguiente error:

Error en py_run_string_impl(código, local, convertir): NotValidPayload: ['gato', 'perro'] --> el texto debe ser un texto válido con un máximo de 5000 caracteres; de lo contrario, no se podrá traducir

Sin embargo, está claro que aquí no se trata de caracteres máximos...

¡Muchas gracias por tu ayuda!

YoCreo que el problema es este bit... .translate(r.string) porque no obtiene la cadena del argumento de función de functionToApply sino del espacio de trabajo global. Entonces lapply no podrá pasar valores a la función

- usuario20650

28 de marzo de 2021 a las 1:39

... no respondo a tu pregunta pero el uso .translate_batch(r.string) acepta vectores. Entonces puedes ejecutar string <- c("cat", "dog"); functionToApply(string) sin el contenedor exterior

- usuario20650

28 de marzo de 2021 a las 1:53



------------------------------------

Esta versión funciona en mi computadora con un entorno conda llamado "rprog".

library(reticulate)
use_condaenv("rprog", required = TRUE)
py_run_string(
"
from deep_translator import GoogleTranslator
def google_translator(string):
    return GoogleTranslator(source='en', target='fr').translate(string)
"
)
lapply(c("hello", "coffee"), py$google_translator)

[[1]]
[1] "Bonjour"

[[2]]
[1] "café"

Es importante llamar a la biblioteca (reticulada). De lo contrario, el objeto py no estará disponible y no podrá acceder a los objetos de Python.

En lugar de llamar a una función de R, crea una función de Python y llama a esa función desde R.



------------------------------------

Pruebe lapply(c("gato", "perro"), FUN = TranslateEnglishStringToFrenchString)

1

Muchas gracias Chriss pero tengo exactamente el mismo error...

- Ludovic Bocken

28 de marzo de 2021 a las 1:34

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare