9
votes

Manipuler des expressions dans r

Je cherche un moyen de créer une expression qui est le produit de deux expressions données. Par exemple, supposons que j'ai xxx

maintenant, je veux créer de manière programmative l'expression (E1) * (E2) : xxx

fond J'écris une fonction de montage de modèle. Le modèle a deux pièces qui sont définies par l'utilisateur. Je dois être capable de les "gérer" séparément, puis créer une expression combinée et "gérer" comme un modèle. "Manipulation" implique de prendre des dérivés numériques et de la fonction dérivé veut des expressions comme une entrée.


1 commentaires

À titre de note latérale: si vous êtes dans une situation similaire mais ne nécessite pas d'expression pour une sortie, créez des fonctions et utilisez plutôt le corps pour modifier le contenu de la fonction.


3 Réponses :


5
votes

Essayez ceci:

e1 <- quote(a+b*x)   # or expression(*)[[1]]
e2 <- quote(c+d*x)
substitute(e1 * e2, list(e1=e1, e2=e2))


1 commentaires

Merci! J'ai accepté la réponse de Dason, qui est essentiellement la même idée, car il a répondu à la question exacte posée, mais cette réponse a fourni une idée supplémentaire.



5
votes

Je ne traite pas de cela trop souvent, mais quelque chose comme ça semble fonctionner xxx


1 commentaires

Merci, c'est ce dont j'avais besoin. Les parenthèses de (E1) * (E2) ne sont même pas nécessaires - R est suffisamment intelligente pour les mettre dans.



2
votes

Il est probablement surkill dans votre cas, mais le ryacas < / code> paquet peut être agréable pour effectuer des manipulations symboliques plus compliquées de ce type: xxx

aussi, au lieu d'utiliser substitut () , vous pouvez Construisez la même expression dans la base R comme ceci: xxx

note explicative: un aspect initialement déroutant de traiter avec expression Les objets sont qu'ils sont vraiment listes d'objets linguistiques - même lorsque (comme c'est souvent le cas), ces listes ne contiennent qu'un seul objet. Par exemple, dans votre question, E1 et E2 sont des listes de longueur 1 contenant un seul appel objet chacun.

Travailler à partir de l'intérieur, le code ci-dessus:

  1. extrait les deux objets appel à l'aide de [[1]]
  2. utilise as.call () pour construire un nouvel appel qui est le produit des deux appel objet.
  3. Enfin, enveloppe l'appel résultant sauvegardez comme l'expression objet que vous souhaitez.

2 commentaires

Oui, j'ai essayé de jouer avec l'expression comme une liste, mais je ne pouvais pas le faire fonctionner. Pas étonnant, c'est délicat.


Sans aucun doute. Cela commence à faire beaucoup de sens pour moi après environ 5 ans de travailler avec la langue très régulière. Bonne chance à construire votre fonction.