Как использовать лямбда-аргумент 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