Analizar cadena con el símbolo "*" en ella sin crear espacios adicionalesHola,
Estoy iterando programáticamente a través de un par de matrices para crear una variable de cadena que se puede analizar y evaluar para adaptar un modelo a los datos automáticamente.
El problema que estoy encontrando es que los encabezados de las columnas se llaman "DL * 15".
Por lo tanto, cuando intento analizar y evaluar ": DL * 15", aparece un error porque el análisis crea: DL * 15. El espacio adicional invalida la evaluación, porque la columna se llama: DL * 15 no: DL * 15.
A continuación se muestra un ejemplo de lo que está pasando:

¿Hay alguna forma de evitar que se produzca el espaciado al analizar "DL * 15"?
Gracias,
Nate
Re: Analizar cadena con el símbolo "*" en él sin crear espacios adicionalesla envoltura del nombre gira alrededor del nombre completo, no solo del carácter que hace que el nombre parezca una expresión.
O...
Hay otras formas de construir expresiones como esta, usando las funciones de manejo de expresiones para manipular expresiones directamente en lugar de trabajar con cadenas y analizar las cadenas en expresiones. Si tu tabla tuviera una columna con el nombre " sin (a) * cos (b) "podrías hacer esto
ex = expr(
Fit Model(
Y( YVARIABLEPLACEHOLDER ),
Effects( :age, :sex, :height ),
Personality( "Standard Least Squares" ),
Emphasis( "Effect Leverage" ),
Run(
:weight << {Plot Actual by Predicted( 1 ), Plot Regression( 0 ),
Plot Residual by Predicted( 1 ), Plot Effect Leverage( 1 )}
)
)
);
substituteInto( ex, expr(YVARIABLEPLACEHOLDER), asName("sin(a)"||"*"||"cos(b)") );
show(ex);
ex = modelo de ajuste (Y ( Nombre ("sin (a) * cos (b)") ), Efectos (: edad,: sexo,: altura), Personalidad ("Mínimos cuadrados estándar"), Énfasis ("Apalancamiento de efecto"), Ejecutar (: peso << {Plot Actual by Predicted (1), Regresión de plot (0 ), Plot Residual by Predicted (1), Plot Effect Leverage (1)}));
SubstituteInto busca el primer argumento para el segundo argumento y lo reemplaza con el tercer argumento. AsName convierte una cadena en un nombre. La función expr () se usa para pasar una expresión sin evaluarla primero.
Verá la envoltura de Nombre (), mucho, si nombra columnas como esta
Re: Analizar cadena con el símbolo "*" en él sin crear espacios adicionalesAlgunas notas en mi respuesta:
los "\ [... ] \ " construir le permite poner cualquier cosa dentro de las comillas dobles, incluso más comillas dobles.
evalinsert sustituye valores por variables rodeadas por el carácter ^.
Re: Analizar cadena con el símbolo "*" en él sin crear espacios adicionalesNo puedes mezclar: D y: nombre.
Intenta algo como esto:
fitmodelstring = fitmodelstring || evalinsert("\[Y(:name("D^a[i]^ * ^b[j]^"), Efffects(]\");
Re: Analizar cadena con el símbolo "*" en él sin crear espacios adicionalesDije que se resolvió un poco demasiado pronto.
Probé el código pero no funciona en el contexto más complejo de mi situación en el que estoy iterando a través de dos matrices.
Sin escribir todo el código, esto no funcionará ya que la palabra "nombre" seguirá apareciendo.

Después del bucle, tomaré la cadena final y primero la analizaré y luego la evaluaré.
eval (parse (fitmodelstring));
Tenga en cuenta que toda la cadena en bucle no se muestra arriba.
Gracias,
Nate
Re: Analizar cadena con el símbolo "*" en él sin crear espacios adicionalesUse la envoltura de nombre () alrededor del nombre problemático.
a="D";
b="L";
c="* 15";
f = "name(\!""||a||b||c||"\!")";
ex = parse(f);
show(ex);
ex = Nombre ("DL * 15");
la envoltura no está realmente allí; es una sugerencia para el analizador que este nombre no sigue las reglas habituales. También se muestra con el envoltorio por la misma razón. Observe también el \! "Para añadir las comillas.