Source code for pymixef.interoperability.r
"""R/lme4/glmmTMB formula translation."""
from __future__ import annotations
from .._contracts import CompatibilityIssue
from .base import CompatibilityReport, InterchangeResult
[docs]
def translate_r_formula(formula: str) -> InterchangeResult[str]:
"""Translate the supported lme4 formula subset without changing semantics.
PyMixEF intentionally uses the same operators for its safe formula grammar.
R function calls and environment lookups are refused because arbitrary code
evaluation is outside that grammar.
"""
value = formula.strip()
detected: list[CompatibilityIssue] = []
if "~" not in value:
detected.append(
CompatibilityIssue(
"formula",
"unsupported",
"An R model formula must contain '~'.",
)
)
else:
detected.append(
CompatibilityIssue(
"formula operators",
"exact",
"Fixed effects, interactions, nesting, and random |/|| operators "
"share PyMixEF semantics.",
)
)
unsafe_tokens = ("::", "$", "[[", "I(", "poly(", "ns(", "bs(")
for token in unsafe_tokens:
if token in value:
detected.append(
CompatibilityIssue(
token,
"unsupported",
"R environment/function evaluation is not executed by PyMixEF; "
"create the transformed column explicitly.",
)
)
return InterchangeResult(
value=value,
report=CompatibilityReport(
source_format="R formula",
target_format="PyMixEF formula",
issues=tuple(detected),
),
)