rpy2: как вызвать функцию с параметром в python flask restful? - PullRequest
2 голосов
/ 29 апреля 2020

в flask -restplus, я пытаюсь вызвать функцию R с параметром из Python, где параметр приходит из тела запроса POST JSON body. Для этого сначала я загружаю функцию R в python и передаю данные json в качестве параметра, но в итоге получаю следующую ошибку:

TypeError: 'ListVector' object is not callable

Я не понимаю почему, я не нашел много в rpy2 документации о вызове функции. Есть ли способ передать параметр в функцию R и вызвать эту функцию в python? Кто-нибудь может указать мне любой возможный способ сделать это? Любая мысль?

мой текущий код попытки с минимальным API

ввод json данные:

{
  "body": {
    "sex": "M",
    "feat_aa": {
      "value": 12,
      "machine": "AC"
    },
    "feat_bb": {
      "value": 13,
      "machine": "AB"
    }
  }
}

игрушка R функция:

library(jsonlite)

my_func <- function(json_data){
  qry=fromJSON(json_data)
  data=qry$body
  ## do something 
}

вот основной код для минимального flask api:

from flask import Flask, jsonify, request
from flask_restplus import Api, Namespace, Resource, fields
import rpy2
import rpy2.robjects as robjects

##
app = Flask(__name__)
api = Api(app)
ns = Namespace('hello') 

features_attr = api.model('hello_world', {
    'value': fields.Integer(required=True),
    'machine': fields.String(required=True)
})

feat_root_objs = api.model('my machine', {
    'sex': fields.String(required=True),
    'features': fields.List(fields.Nested(features_attr, required=True))
    })

@ns.route('/hello')
class helloWorld(Resource):
    @ns.expect(feat_root_objs, validate=False)
    def post(self):
        myfunc = robjects.r.source("my_func.R")
        param = request.get_json()
        res = myfunc(['param'])
        # res = myfunc(param)
        return jsonify(res)

if __name__ == '__main__':
    api.add_namespace(ns)
    app.run(debug=True)

Как передать параметр / аргументы в функцию R и сделать вызов функции из python? есть мысли, чтобы это произошло? спасибо

обновление

Я также пытался эту попытку:

    def post(self):
        myfunc = robjects.r.source("my_func.R")
        param = request.get_json()
        res = myfunc(param)
        return jsonify({"output": res})

, но у меня всегда появляется следующая ошибка:

> [2020-04-29 12:47:02,104] ERROR in app: Exception on
> /Ed_features/match_ed [POST] Traceback (most recent call last):   File
> "C:\Users\jyson\AppData\Local\Programs\Python\Python37\Lib\site-packages\flask\app.py",
> line 1832, in full_dispatch_request
>     rv = self.dispatch_request()   File "C:\Users\jyson\AppData\Local\Programs\Python\Python37\Lib\site-packages\flask\app.py",
> line 1818, in dispatch_request
>     return self.view_functions[rule.endpoint](**req.view_args)   File "C:\Users\jyson\AppData\Local\Programs\Python\Python37\Lib\site-packages\flask_restplus\api.py",
> line 309, in wrapper
>     resp = resource(*args, **kwargs)   File "C:\Users\jyson\AppData\Local\Programs\Python\Python37\Lib\site-packages\flask\views.py",
> line 88, in view
>     return self.dispatch_request(*args, **kwargs)   File "C:\Users\jyson\AppData\Local\Programs\Python\Python37\Lib\site-packages\flask_restplus\resource.py",
> line 44, in dispatch_request
>     resp = meth(*args, **kwargs)   File "C:\Users\jyson\match_api\imm_server\heylo_ed.py", line 58, in post
>     res = myfunc(param) TypeError: 'ListVector' object is not callable
...