Как использовать лямбда-аргумент smooth.spline в RPy БЕЗ Python, интерполирующего его как лямбда

Я хочу использовать естественные кубические сглаживающие сплайны smooth.splineиз R в Python (как и многие другие ( естественные сглаживающие сплайны Python, есть ли Python, эквивалентный функции smooth.spline в R, Python SciPy UnivariateSpline vs R smooth.spline,...)) Поэтому я используюrpy2как описано в https://morioh.com/p/eb4151821dc4, но я хочу установить напрямуюlambda вместо того spar:

import rpy2.robjects as robjects
r_y = robjects.FloatVector(y_train)
r_x = robjects.FloatVector(x_train)

r_smooth_spline = robjects.r['smooth.spline'] #extract R function# run smoothing function
spline1 = r_smooth_spline(x=r_x, y=r_y, lambda=42)
#alternative: spline1 = r_smooth_spline(x=r_x, y=r_y, spar=0.7) would work fine, but I would like to control lambda dirctly
ySpline=np.array(robjects.r['predict'](spline1,robjects.FloatVector(x_smooth)).rx2('y'))
plt.plot(x_smooth,ySpline)

Когда я это сделаю, линия spline1 = r_smooth_spline(x=r_x, y=r_y, lambda=42) не работает, потому что Python уже имеет предопределенную интерпретацию lambda (вы можете видеть это по синему выделению кода lambda):(Я хочу lambda интерпретируется как лямбда параметра штрафа за сглаживание.

Если я заменю lambda по spar Я бы получил естественный кубический сплайн, но я хочу контролировать lambda прямо.

3 ответа

Решение

Этот небольшой трюк поможет обойти вашу конкретную проблему, позволив вам записать "лямбда" в строку.

kwargs = {"x": r_x, "y": r_y, "lambda":  42}
spline1 = r_smooth_spline(**kwargs)

В общем случае вы можете легко передавать контейнеры аргументов с помощью кортежей и dicts.

# as normal
f = function("foo", "bar", my_kwarg="my_value")

# the same call using argument containers
args = ("foo", "bar")
kwargs = {"my_kwarg": "my_value"}
f = function(*args, **kwargs)

Возможно, вы могли бы использовать rpy2"S Function.rcall() метод при вызовеsmooth.spline?

import rpy2.robjects as robjects
r_y = robjects.FloatVector(y_train)
r_x = robjects.FloatVector(x_train)

r_smooth_spline = robjects.r['smooth.spline']
args = (('x',r_x), ('y',r_y), ('lambda',42)) # pattern (('argname', value),...)

# import R's "GlobalEnv" to evaluate the function
from rpy2.robjects import globalenv

spline1 = r_smooth_spline.rcall(args, globalenv)

Вы можете использовать Python **<dict> в вызове функции, чтобы указать именованные аргументы R, имя которых не является синтаксически допустимым в Python.

См. Документацию для более подробной информации: https://rpy2.github.io/doc/v3.2.x/html/robjects_functions.html

Другие вопросы по тегам