ExpressionScript - Presentación
From LimeSurvey Manual
Introducción
LimeSurvey utiliza el nuevo módulo ExpressionScript (EM) que le permite a LimeSurvey admitir ramificaciones, evaluaciones, validación y personalización más complejas. Reemplaza la forma en que LimeSurvey administra los Reemplazos, las Condiciones y las Evaluaciones en el back-end. También acelera considerablemente el procesamiento ya que elimina la mayoría de las lecturas de la base de datos en tiempo de ejecución. EM fue desarrollado por el Dr. Thomas White (TMSWhite).
Definiciones clave
- Expresión: Cualquier cosa entre llaves:
- Siempre y cuando no haya espacios en blanco inmediatamente después de la llave de apertura o antes de la llave de cierre.
- Se evalúa el contenido de la expresión por EM, por lo que puede contener fórmulas matemáticas, funciones y procesamiento complejo de cadenas y fechas.
- Sastrería: A veces se le llama "tubería". Es el proceso de modificar texto condicionalmente:
- Tiene acceso a todos los 'campos de reemplazo', datos de los participantes y datos de respuesta.
- También tiene acceso más fácil a las preguntas, respuestas y sus propiedades.
- Relevancia Ecuación: un nuevo atributo de pregunta que controla la visibilidad de la pregunta:
- Si hay una ecuación de relevancia, entonces la pregunta solo se muestra si la relevancia se evalúa como verdadera.
- Internamente, todos los comandos array_filter y array_filter_exclude se vuelven relevantes a nivel de subpregunta.
- SGQA' (cómo se nombraban las variables en el pasado) :
- Significa Survey-Group-Question-Answer
- Los nombres de las variables SGQA se parecen a 123X5X382X971 y pueden tener sufijos de subpreguntas.
- Estos nombres de variables son específicos del S/Q/ subyacente. Códigos de base de datos G/A, por lo que es necesario cambiarlos con frecuencia. N!#Ecuación Tipo de pregunta: Un nuevo tipo de pregunta que guarda cálculos o informes en la base de datos:! N!#*Es como una pregunta repetitiva, pero su contenido se guarda en la base de datos incluso si configura "Ocultar siempre esta pregunta".
- Código de pregunta: Este es el nombre de variable preferido para EM:
- Este puede ser un nombre descriptivo que indique el propósito de la pregunta, lo que facilita la lectura de la lógica compleja.
- Los códigos de pregunta válidos NO deben comenzar con un número, por lo que cuando se utiliza el código de pregunta para numere sus preguntas, simplemente use "q1", o "q1a" o "g1q2".
- Esto es lo que se convierte en el nombre de la variable si exporta datos a SPSS o R. Entonces, si realiza un análisis estadístico, necesita para crear solo códigos de preguntas únicos.
¿Tengo que usar EM?
La respuesta corta es no". Sin embargo, esto depende en gran medida de la complejidad de la encuesta que desee crear.
Por ejemplo, el Editor de condiciones cubre algunas expresiones básicas que se pueden aplicar a las preguntas de su encuesta. Sin embargo, el editor de condiciones es limitado. Es por eso que se utiliza EM: amplía el ámbito de posibilidades de personalización.
¿Puedo mezclar condiciones y ecuaciones de relevancia?
Sí. Puede utilizar el Editor de condiciones para algunas preguntas y Ecuaciones de relevancia para otras.
¡No se pueden configurar ambas condiciones y expresiones en la misma pregunta! Una vez que se configura una condición, reemplaza cualquier expresión escrita en el campo de ecuación de relevancia. Además, el campo Ecuación de relevancia ya no se puede editar manualmente.
Sin embargo, existe una manera de utilizar tanto expresiones como condiciones dentro de una pregunta. Como se mencionó anteriormente, una condición reemplaza el campo de ecuación de relevancia. Una vez hecho esto, verifique cuál es la ecuación recién creada y cópiela en un editor de texto. Elimine la condición recién creada del Editor de condiciones y luego edite la pregunta agregando las expresiones basadas en condiciones de su archivo de editor de texto junto con el resto de las expresiones que desea usar.
¿Cómo debo elegir entre Condiciones y Relevancia?
Aquí hay una lista de los pros y los contras de cada estilo:
Estilo | Pros | Contras |
---|---|---|
Condiciones | 1. Excelente GUI para crear condiciones simples. 2. GUI bien documentada y comprendida por el equipo de soporte |
1. Solo admite comparaciones simples y no cumple bien con las condiciones "Y" y "O". 2. Las condiciones en cascada funcionan de forma errática 3. Lento - uso intensivo de bases de datos - puede ralentizar encuestas largas. 4. Algunos informaron problemas con las condiciones de recarga. 5. La GUI no escala bien cuando hay docenas, cientos o miles de preguntas. 6. Podría resultar lento convertir encuestas en papel, ya que debe utilizar nombres SGQA. 7. A menudo se necesita un programador para codificar la lógica personalizada necesaria para bifurcaciones complejas. |
Relevancia | 1. Admite lógica muy compleja, incluidas más de 80 funciones y operadores matemáticos/de cadenas. 2. Soporte perfecto para lógica en cascada. 3. Rápido: sin llamadas adicionales a la base de datos y admite más de 1000 encuestas de preguntas. 4. No hay problemas con la lógica de recarga ya que no requiere códigos SGQA. 5. El resaltado de sintaxis escala a más de 1000 encuestas de preguntas. 6. Fácil y rápido de usar para grupos que deseen informatizar encuestas en papel existentes. 7. Admite fácilmente entrevistas semiestructuradas y encuestas epidemiológicas sin necesidad de programador. |
1. Sin GUI para condiciones simples: utiliza syntax-highlighting en su lugar. |
{{Nota| Nota:
- Le recomendamos que utilice lo que mejor se adapte a sus necesidades.
- Para una explicación más detallada de las características de EM, haga clic en el siguiente [[EM y sus características|enlace] ].}}
Empezando
La mejor manera de comenzar con EM es:
- Instalar la última versión estable desde https://www.limesurvey.org/en/download.
- Importe y explore algunas encuestas de muestra.
- Explore los casos de uso y procedimientos y los paso- ejemplos paso a paso.
- Explore la documentación de EM (esta página)
- Pruebas unitarias de expresiones aisladas (avanzadas)
- muestra ejemplos del uso de todas las funciones y operadores de EM, y el Resultados de PHP y JavaScript;
- tenga en cuenta que hay pocas funciones que generan resultados diferentes en las versiones de PHP y JavaScript, por lo que esta página le permite planificar su lógica EM en consecuencia.
- Pruebas unitarias de expresiones aisladas (avanzadas)
Terminología
Estas palabras se usan comúnmente para describir las capacidades de EM:
- Bramificación basada en relevancia; si una pregunta es relevante, hágala; de lo contrario, no la haga (por ejemplo, hágala invisible y márquela). como NULL en la base de datos). Puede encontrar los Campos de relevancia en el panel del editor de preguntas, así como en el panel del editor del grupo de preguntas. Este último se utiliza para aplicar un conjunto de condiciones a un grupo completo sin tener que copiar la misma condición a cada pregunta y/o combinar la lógica condicional a nivel de grupo y de pregunta).
- Sastrería - Una vez que sepa qué preguntas se deben formular, la adaptación (a veces llamada "piping") especifica cómo se debe formular la pregunta. Esto le permite admitir no solo la sustitución simple (como {TOKEN:FIRSTNAME}), sino también la conjugación de verbos y la declinación de sustantivos según el género o el número de sujetos. También le permite cambiar el mensaje que entrega a un encuestado en función de si respondió (o cómo respondió) otras preguntas.
- Ecuaciones - EM agrega un nuevo tipo de pregunta llamado Ecuación que almacena el resultado de una Expresión. Los resultados de la ecuación se calculan y escriben en la base de datos, incluso si los oculta en la página. Por lo tanto, se utilizan para cálculos de puntuación ocultos, navegación basada en ecuaciones complejas, evaluaciones e informes que se generarán y almacenarán en la base de datos.
Relevancia y relevancia en cascada
Cada tipo de pregunta ahora tiene una Opción de relevancia que controla si la pregunta se muestra o no. El EM procesa cada ecuación de relevancia en el orden en que aparecen en la encuesta. Si la expresión es verdadera (o falta, para admitir encuestas heredadas), se mostrará la pregunta. Si no es relevante, la pregunta se ocultará y el valor se anulará en la base de datos. Si no hay preguntas relevantes en un grupo, se omitirá todo el grupo.
Además, si alguna de las variables dentro de una expresión es irrelevante, la expresión siempre se evalúa como falsa. Esto habilita Relevancia en cascada para que no tenga que escribir ecuaciones de relevancia muy largas para cada pregunta.
Supongamos que tiene cinco preguntas Q1-Q5 y solo desea mostrar la Q2 si se respondió la Q1 y la Q3 si se respondió la Q2, etc. Las ecuaciones de relevancia podrían ser:
Código de pregunta | Relevancia | Pregunta |
---|---|---|
Q1 | 1 | ¿Cuál es tu nombre? |
Q2 | Q1 | {Q1}, ¿cuántos años tienes? |
Q3 | Q2 | Entonces, tienes {Q2} años. ¿Estás casado? |
Q4 | Q3 == "Y" | {Q1}, ¿cuánto tiempo llevas casado? |
Q5 | Q4 | ¿Cuántos hijos tienes, {Q1}? |
Relevancia a nivel de grupo
ExpressionScript también admite relevancia a nivel de grupo. Esto facilita la implementación del bucle. Supongamos que desea recopilar información de hasta 10 entidades (como productos o personas de un hogar), donde primero determina cuántas entidades necesitan seguimiento (por ejemplo, preguntando cuántas personas viven en un hogar o haciendo que las personas verifiquen cuáles productos que les gustan de una larga lista). Después de saber cuántas entidades necesitan seguimiento, puede usar la relevancia a nivel de grupo como {count >= 1}, {count >=2}, ... {count >= 10} para cada uno de los 10 grupos de seguimiento. hacer preguntas. Dentro de cada grupo, puede tener lógica condicional a nivel de preguntas (por ejemplo, preguntas de seguimiento específicas de género o edad para cada tema). Las ecuaciones de relevancia a nivel de grupo y de pregunta se combinan con AND para determinar cuál debe mostrarse.
Para comprobar un ejemplo de este tipo, importe la siguiente encuesta: Ejemplo de encuesta del censo.
Se puede observar en la siguiente captura de pantalla que el grupo Persona 1 se muestra (o es relevante) si el encuestado vive con al menos otro conviviente:
Sastrería/Tuberías
Todo lo que esté entre llaves ahora se trata como una expresión (con una excepción que se describe a continuación). Las expresiones tienen acceso a todos los LimeReplacementFields y variables (a través de varios alias), a todos los operadores de ecuaciones típicos (matemáticos, lógicos y de comparación) y a docenas de funciones (que incluso funcionan dinámicamente en el lado del cliente).
Al utilizar estas ecuaciones, puede hacer cosas como:
- Mostrar condicionalmente mensajes personalizados a los encuestados en función de respuestas anteriores;
- Crear evaluaciones y mostrar los resultados de las evaluaciones (o bifurcar o mostrar mensajes condicionalmente) en función de esos resultados , todo sin usar el módulo de evaluaciones en sí;
- Conjugar verbos y declinar sustantivos dentro de preguntas, respuestas e informes;
- Mostrar resúmenes de respuestas antes de la página "Muestre sus respuestas" en la final de la encuesta.
Ecuaciones
Hay un nuevo tipo de pregunta llamado Ecuación. Piense en ello como un Tipo de pregunta de visualización de texto, excepto que almacena el valor de lo que se muestra en la base de datos. Entonces, si el texto de la pregunta de ecuación contiene un cálculo de evaluación, ese valor se almacenará en la base de datos en una variable que se puede mostrar en estadísticas públicas o privadas.
Sintaxis
Todo lo contenido entre llaves ahora se considera una expresión (con una excepción: no debe haber espacios en blanco al principio ni al final; esto es necesario para garantizar que ExpressionScript no intente procesar JavaScript incrustado).
Tenga en cuenta que está bien que las expresiones abarquen varias líneas, siempre y cuando no haya espacios en blanco después de la llave de apertura o antes de la llave de cierre. Esto es especialmente útil para declaraciones "if()" anidadas como esta:
{if(is_empty(PFTotals),
'',
if(PFTotals >= -5 && PFTotals <= -4,
'Muy suave',
if(PFTotals >= -3 && PFTotals <= -2,
'Suave',
if(PFTotals == -1,
'Algo suave',
if(PFTotals == 0,
'Moderado',! N! if(PFTotals == 1,
'Algo difícil',
if(PFTotals >= 2 && PFTotals <= 3,
'Difícil',
if(PFTotals >= 4 && PFTotals <= 5,
'Muy difícil',
''
)
)
)
)
)
)
)
)} !¡NORTE!
ExpressionScript admite la siguiente sintaxis:
- Todos los operadores matemáticos estándar (por ejemplo, +,-,*,/,!);
- Todos los operadores de comparación estándar (por ejemplo, <,<=,==,!=,> ,>=, más sus equivalentes: lt, le, eq, ne, gt, ge);
- Paréntesis (para que pueda agrupar subexpresiones);
- Operadores condicionales (por ejemplo, &&,| | y sus equivalentes: y, o);
- Cadenas entre comillas simples y dobles (cada una de las cuales puede incrustar cadenas con el otro tipo de comillas);
- Operador de coma (por lo que puede tener una lista de expresiones y simplemente devolver el resultado final );
- Operador de asignación (=);
- Variables predefinidas (para hacer referencia a preguntas, atributos de preguntas y respuestas); por ejemplo, el códigos SGQA;
- Funciones predefinidas (ya hay más de 80 y es fácil agregar más).
Operadores
La sintaxis EM sigue la precedencia normal de operadores:
Nivel | Operador(es) | Descripción |
---|---|---|
1 | () | paréntesis para agrupar o llamar funciones |
2 | ! - + | operadores unarios: no, negación, unario-más |
3 | * / | veces, dividir |
4 | + - | más , menos |
5 | < <= > >= lt le gt ge | comparaciones relativas |
6 | == != eq ne | comparaciones de igualdad |
7 | y | lógico AND |
8 | o | lógico OR |
9 | = | asignación operador |
10 | , | operador de coma |
Advertencia con número y cadena que no coinciden y comparación alfabética/numérica
Cuando desee comparar valores con comparaciones relativas o de igualdad, preste atención a las discrepancias. Un valor ingresado por el usuario (o proporcionado mediante un código de respuesta) se puede utilizar como número si es claramente un número.
Si rodea uno de los valores con "
, se realizará una comparación de texto/cadena lugar. Si desea comparar como un número, nunca rodee un número con "
.
Por ejemplo Q0.NAOK > "50"
es verdadero si Q0.NAOK es una pregunta numérica con 9 como valor. Esto se debe a que el operador >
asumirá que se trata de una comparación alfabética y no numérica .
Para asegurarse de comparar valores enteros, puede usar intval(Q0.NAOK) > 50
. Solo recuerde si Q0.NAOK no es un número (vacío o una cadena), entonces intval(Q0.NAOK) === 0. Para comparar valores de cadena ("A" < "B") use strcmp directamente: strcmp(Q0.NAOK,"B")
o strcmp(Q0.NAOK,"A5")
.
Precaución sobre el uso del operador de asignación (=)
Debe evitar el uso de operadores de asignación a menos que sea absolutamente necesario, ya que pueden provocar efectos secundarios inesperados. Por ejemplo, si cambia el valor de una respuesta anterior, la relevancia en cascada y la lógica de validación entre esa pregunta y la pregunta actual no se vuelven a calcular, por lo que podría terminar con datos internamente inconsistentes (por ejemplo, preguntas que permanecen respondidas pero que no deben responderse han sido anuladas, o preguntas que se omitieron pero que deberían haber sido respondidas). En general, si desea asignar un valor a una variable, debe crear un tipo de pregunta de ecuación y usar una expresión para establecer su valor. Sin embargo, hay ocasiones excepcionales en las que la gente realmente necesita este operador, por lo que lo ponemos a disposición.
Para ayudarle a advertirle acerca de este operador, se muestra en fuente roja dentro de las ecuaciones de sintaxis (para que no lo confunda con "==").
Usando el operador de asignación
Las principales razones por las que es posible que desee utilizar el operador de asignación son:
- Necesita establecer el valor predeterminado mediante una ecuación para una pregunta que no acepta valores predeterminados (como la lista de radio, donde la interfaz de usuario le permite elegir uno de las opciones de respuesta, pero no te permite ingresar una ecuación). Sin embargo, tenga cuidado, ya que LimeSurvey no podrá validar que su ecuación genere una de las respuestas permitidas para esa pregunta;
- Necesita cambiar a la fuerza la respuesta a una pregunta anterior basándose en una respuesta posterior;
*etc...
Puede utilizar todo el sistema de gestión de expresiones para este propósito. Es mejor utilizar una Equation para este propósito.
Algunos ejemplos:
- Establecer respuesta a una pregunta de texto breve en minúsculas:
{QCODE=strtolower(QCODE.NAOK)}
; - Establecer una respuesta predeterminada a un tipo de pregunta de matriz al inicio de una encuesta:
{Q1_SQ1=(is_empty(Q1_SQ1.NAOK),"A99",Q1_SQ1.NAOK)}
; - Establezca una respuesta predeterminada para un tipo de pregunta de textos de matriz al inicio de una encuesta:
{Q1_SQY1_SQX1 = (is_empty(Q1_SQY1_SQX1.NAOK),"Inserted answer", Q1_SQY1_SQX1.NAOK)}
; - Establezca una respuesta con condición:
{QCODE=if(YesNo="Y","A1","")}
.
seguridad XSS
Con XSS habilitado, algunas partes del sistema de administrador de expresiones no se pueden usar:
- comenzar una etiqueta HTML en una expresión pero terminar en otra expresión;
- usar una expresión compleja dentro de una URL .
<html>Ejemplos y soluciones alternativas:
{if( 1 ,"","")}information{if( 1 ,"","")}
funciona con la seguridad XSS, aquí puede usar{if(1," ;
information","information")}<a href="/script.php?value={if(QCODE == "Y","yes","no")}">next</a>
, here you can use an equation question because using a complete question code is OK :<a href="/script.php?value={EQUATION.NAOK}">next</a>
.{if(1," ;
)}<a href="/script.php?value={if(QCODE == "Y","yes","no")}">next</a>
, here you can use an equation question because using a complete question code is OK :<a href="/script.php?value={EQUATION.NAOK}">next</a>
.
Acceso a variables
ExpressionScript proporciona acceso de sólo lectura a cualquier variable que pueda necesitar. Para compatibilidad con versiones anteriores, proporciona acceso a lo siguiente:
- TOKEN:xxx - el valor de un TOKEN (por ejemplo, TOKEN:FIRSTNAME, TOKEN:ATTRIBUTE_5) (solo para 'no ' encuesta anónima).
- INSERTANS:SGQA - el valor mostrado de una respuesta (por ejemplo, "Sí") - similar al uso de {QCODE.shown }.
- Todos los {XXX} valores utilizados por las plantillas.
- En el texto de la pregunta, puede usar {QID} reemplazado por el ID de la pregunta y {SGQ} reemplazado por SGQA de la pregunta.
Además, ExpressionScript le permite hacer referencia a variables mediante el código de pregunta (la columna 'título' en la tabla de preguntas dentro de la base de datos). Esta es también la etiqueta de variable que se utiliza cuando exporta sus datos a SPSS, R o SAS. Por ejemplo, si tiene preguntas sobre nombre, edad y sexo, puede llamar a esas variables "nombre", "edad" y "género" en lugar de "12345X13X22", "12345X13X23". ' y 12345X13X24. Esto hace que las ecuaciones sean más fáciles de leer y validar para todos, además de hacer posible barajar las preguntas sin tener que realizar un seguimiento de los números de grupo o de pregunta.
Importante: Es más seguro hacer referencia a las variables que aparecen en las páginas o preguntas anteriores.
Además, ExpressionScript te permite acceder a muchas propiedades de la pregunta:
Sintaxis | Significado | Ejemplo | Resultado del ejemplo | ||||
---|---|---|---|---|---|---|---|
Qcode | un alias para Qcode.code | {implode(',',nombre,género )} | 'Tom','M' | ||||
Qcode.code | el código de respuesta seleccionado para la pregunta si es relevante (de lo contrario, en blanco), o el valor del texto si no es pregunta codificada | {implode(',',name.code,gender.code)} | 'Tom','M' | ||||
Qcode.NAOK | igual que Qcode - ver discusión de NAOK | {gender.NAOK} | 'M' | ||||
Qcode.value | el valor de evaluación de la pregunta si es relevante (de lo contrario, en blanco), o el valor del texto si no lo es una pregunta codificada | {gender.value} | '1' | ||||
Qcode.valueNAOK | igual que Qcode.value - ver discusión sobre NAOK | {gender.valueNAOK} | '1 ' | ||||
Qcode.shown | el valor mostrado para la pregunta | {implode(',',name.shown,gender.shown)} | - | Qcode.question | el texto de la pregunta | {gender.question} | '¿Cuál es tu género?' |
Qcode.mandatory | si la pregunta es obligatorio (Y/N) | {gender.mandatory} | 'N' | ||||
Qcode.qid | el número de pregunta interna (no el número secuencial) | {gender.qid} | 337 | ||||
Qcode.type | el tipo de pregunta | {gender.type} | 'G' | ||||
Qcode.jsName | el nombre javascript correcto para la pregunta, independientemente de si está declarada dentro o fuera de esta página | {gender.jsName} | 'java1827X3X337' | ||||
Qcode.gid | el número de grupo interno (no el número secuencial) | {gender.gid} | 3 | ||||
Qcode.qseq | el número secuencial de la pregunta, comenzando desde 0 | {gender.qseq} | 5 | ||||
Qcode.gseq | el número secuencial del grupo, comenzando desde 0 | {gender.gseq} | 1 | ||||
Qcode.relevanceStatus | si la pregunta es actualmente relevante (0 o 1 ) | {gender.relevanceStatus} | 1 | ||||
Qcode.relevance | la ecuación de relevancia a nivel de pregunta | {gender.relevance} | '!is_empty(name)' | ||||
Qcode.grelevance | la ecuación de relevancia a nivel de grupo | {gender.grelevance} | 'num_children >= 5' | ||||
Qcode.sgqa | el valor SGQA para esta pregunta | {gender.sgqa} | '1827X3X337' |
Problema con el editor HTML
Si utiliza el editor HTML, algunos caracteres se reemplazan por entidades HTML.
- & by &
- < by <
- > by >
Si usa el editor HTML, debe usar :
- y para &
- lt para <
- le for <=
- gt for >
- ge para >=
Se recomienda borrar su expresión del HTML que aparece dentro de su expresión. Si utiliza el editor HTML de LimeSurvey, haga clic en el botón "Fuente" (ubicado en la parte superior izquierda del editor) y elimine todos los caracteres que no estén relacionados con su expresión (por ejemplo,
,
, etcétera).
Nombre de variable Qcode
Aquí están los detalles de cómo construir un Qcode (y acceder a algunas propiedades) por tipo de pregunta. En general, los Qcodes se construyen como:
Código de pregunta. '_'. ID de subpregunta. '_'. ID de escala
Para comentario y otro, los códigos de pregunta correspondientes son QuestionCode_comment y QuestionCode_other, respectivamente.
Tipo | Descripción | Código | Subpreguntas | Opciones de respuesta | Escalas | Código de respuesta | Respuesta mostrada | Relevancia |
---|---|---|---|---|---|---|---|---|
5 | 5 Botones de opción de elección de punto | Q1 | 1-5 | {Q1} | {Q1.shown} | {Q1==3} | ||
B | Matriz (elección de 10 puntos) Botones de radio | Q2 | |1-10 | {Q2_L2} | {Q2_L2.shown} | {Q2_L2==7} | ||
A | Botones de radio de matriz (elección de 5 puntos) | Q3 | |1-5 | {Q3_1} | {Q3_1.shown} | {Q3_1>=3} | ||
1 | Matriz (Etiquetas flexibles) Escala dual | Q4 | sq1-sq5 | 0 :a1-a3 | 1:b1-b3 | {Q4_sq1_0} | {Q4_sq1_1.shown} | {Q4_sq1_1=='b2'} |
H | Matriz (Flexible) - Formato de columna | Q5 | 1-5 | s,m,t | {Q5_1} | {Q5_1.shown} | {Q5_1=='s'} | |
F | Matriz (Flexible) - Formato de fila | Q6 | |1-5 | {Q6_F3} | {Q6_F3.shown} | {Q6_F3==4} | ||
E | Botones de radio de matriz (aumentar/igual/disminuir) | Q7 | 1- 7 | I,S,D | {Q7_4} | {Q7_4.shown} | {Q7_4=='D'} | |
: | Matriz (Multi Flexi) 1 a 10 | Q8 | ls1,todo ,ls2 | mín,máx,promedio | {Q8_ls1_max} | {Q8_ls2_avg.shown} | {Q8_ls2_min==7} | |
; | Texto de matriz (Multi Flexi) | Q9 | hp,st,sw | 1º,2º,3º | {Q9_hp_3rd} | {Q9_hp_3rd.shown} | {Q9_hp_3rd=='Peter'} | |
C | Matriz (Sí/Incierto/No) Botones de radio | Q10 | 1-5 | S,N,U | {Q10_1} | {Q10_1.shown} | {Q10_3=='Y'} | |
X | Pregunta repetitiva | P11 | {P11.mostrado} | |||||
D | Fecha | P12 | {Q12} | {Q12.mostrado} | ||||
* | Ecuación | P13 | {Q13} | {Q13.shown} | {Q13>5} | |||
~124~ | Carga de archivos (registra el número de archivos cargados) | Q14 | {P14} | {Q14>0} | ||||
G | Lista desplegable de género | P15 | M,F | {Q15} | {Q15.shown} | {Q15=='M'} | ||
U | Texto libre enorme | Q16 | {P16} | {P16.shown} | {strlen(Q16)>100} | |||
I | Pregunta de idioma | P17 | {Q17} | {Q17.shown} | {Q17=='en'} | |||
! | Lista - Desplegable | Q18 | 1-5 | {Q18} | {Q18.shown} | {Q18==3} | ||
L | Lista desplegable/lista de botones de radio | Q19 | AZ | {Q19} | {Q19.shown} | {Q19=='X'} | ||
O | Lista con lista desplegable de comentarios/botones de radio + área de texto | Q20 | AF | {Q20},{Q20comentario} | {Q20.shown} | {Q20=='B'} | ||
T | Texto libre largo | Q21 | {Q21} | {Q21.shown} | {strstr(Q21,'hello')>0} | |||
M | Casilla de verificación de opción múltiple | Q22 | | | {Q22_E}, {Q22_other} | {Q22_E.shown}, {Q22_other.shown} | {Q22_E=='Y'} | ||
P | Casilla de verificación de opción múltiple con comentarios + Texto | P23 | AF | {Q23_D}, {Q23_Dcomment} | {Q23_D.shown} | {!is_empty(Q23)} | ||
K | Pregunta numérica múltiple | Q24 | yo,mamá,papá | {Q24_self} | {Q24_self.shown} | {Q24_self>30} | ||
Q | Múltiples textos cortos | Q25 | AF | {Q25_B} | {Q25_B.shown} | {substr(Q25_B,1,1)=='Q'} | ||
N | Tipo de pregunta numérica | Q26 | {Q26} | {Q26.shown} | {Q26 > 30} | |||
R | Estilo de clasificación | Q27 | 1-4 | {Q27_1} | {Q27_1.shown} | {Q27_1==3} | ||
S | Texto libre corto | Q28 | {Q28} | {Q28.mostrado} | {Q28=='mío'} | |||
Y | Sí/No botones de radio | Q29 | {Q29} | {Q29.mostrado} | {Q29=='Y'} |
Uso de NAOK
NAOK --> "No aplicable" (NA) está bien (OK)
Usar NAOK significa que todas o algunas de las variables son irrelevantes (por ejemplo, "No aplicable" (NA) está bien (OK)).
Por ejemplo: count(Q1_SQ1,Q1_SQ2,Q1_SQ3,Q1_SQ4) siempre proporciona una cadena vacía si se filtra una subpregunta de Q1. Para contar el número de subpreguntas marcadas en dicha pregunta se puede contar(Q1_SQ1.NAOK,Q1_SQ2.NAOK ,Q1_SQ3.NAOK,Q1_SQ4.NAOK). Si la subpregunta está oculta, el EM devuelve una cadena vacía.
Sin NAOK, si una pregunta o una subpregunta está oculta, el EM siempre devuelve una cadena vacía (lo mismo que devolver falso).
El .mostrado siempre usa el sistema NAOK (cadena vacía si está oculto), pero si necesita el código de la respuesta: siempre es una buena idea agregar .NAOK después del código de la pregunta (excepto si lo necesita y sabe lo que hace).
Se proporciona más información en la Subsección Anulación de condiciones en cascada.
Las variables reservadas "esto", "yo" y "aquello"
Muy a menudo desea evaluar todas las partes de una pregunta, como contar cuántas subpreguntas se han respondido o resumir las puntuaciones. Otras veces desea procesar solo ciertas filas o columnas de una pregunta (como obtener las sumas de las filas o columnas y almacenarlas en la base de datos). Estas variables reservadas hacen que el proceso sea relativamente sencillo.
"Esta" variable
La variable "this" se usa exclusivamente dentro de las opciones "Ecuación de validación de pregunta completa" y "Ecuación de validación de subpregunta" (esta última no posible desde la GUI). Se expande a los nombres de variables de cada una de las celdas dentro de esas preguntas. Por lo tanto, si desea asegurarse de que cada entrada sea mayor que tres, deberá establecer la "Ecuación de validación de subpreguntas" en (esto > 3).
"Variable propia"
Las variables "yo" y "ese"' son más poderosas y sirven como macros que se expanden antes de procesar las ecuaciones. Las opciones de sintaxis para la variable "self" son:
- self
- self.suffix
- self.sub-selector
- self.sub- selector.sufijo
- suffix es cualquiera de los sufijos normales de qcode (p. ej., NAOK, valor, mostrado)
- subselector puede ser uno de los siguientes:
- comentarios: solo subpreguntas que son comentarios (por ejemplo, opción múltiple con comentario y lista con comentario);
- nocomments - solo subpreguntas que no son comentarios;
- sq_X - donde X es un identificador de fila o columna. Solo se seleccionan las subpreguntas que coinciden con el patrón X. Tenga en cuenta que la búsqueda se realiza en el identificador de código completo, luego sq_X coincide e incluye las subpreguntas nX, X, Xn (por ejemplo, si usa sq_1, se incluyeron las subpreguntas a1, 1a, 1, 11 o 001). Preste atención al tipo de pregunta de escala dual donde el código de subpreguntas es QCODE_SQCODE_1 y QCODE_SQCODE_1 y al tipo de pregunta de clasificación donde el código de subpregunta es QCODE_1,QCODE_2...
Ejemplos:
- ¿Se ha respondido alguna parte de una pregunta? -> {count(self.NAOK)>0}
- ¿Cuál es la puntuación de evaluación para esta pregunta? -> {suma(valor propio)}
También puede utilizarlos para obtener totales de filas y columnas. Supongamos que tiene una matriz de números con filas AE y columnas 1-5.
- ¿Cuál es el total general? -> {sum(self.NAOK)}
- ¿Cuál es el total de la fila B? -> {sum(self.sq_B.NAOK)}
- ¿Cuál es el total de la columna 3? -> {suma(self.sq_3.NAOK)}
"Esa" variable
La variable "ese" es como la variable "yo", pero le permite hacer referencia a otras preguntas. Su sintaxis es:
- that.qname
- that.qname.suffix
- that.qname.sub-selector' '
- ese.qname.sub-selector.suffix
qname es el nombre de la pregunta sin extensiones de subpregunta. Entonces, creemos una pregunta 'q1', donde 'q' representa también su qname.
Ejemplos:
- ¿Se ha respondido alguna parte de la pregunta q1? -> {count(that.q1.NAOK)>0}
- ¿Cuál es la puntuación de evaluación para el segundo trimestre? -> {sum(that.q2.NAOK)}
- ¿Cuál es el total general de q3? -> {sum(that.q3.NAOK)}
- ¿Cuál es el total de la fila C en q4? -> {sum(that.q4.sq_C.NAOK)}
- ¿Cuál es el total de la columna 2 en q4? -> {suma(that.q4.sq_2.NAOK)}
Las variables "yo" y "ese" se pueden utilizar con cualquier relevancia, validación o adaptación.
La única advertencia es que cuando utiliza la función Mostrar archivo lógico, le mostrará el valor ampliado de "yo" y "eso". Esto le permite ver la ecuación real que se generará para que usted (y el EM) puedan validar si las variables existen o no. Esto puede parecer confuso ya que es posible que veas ecuaciones bastante largas. Sin embargo, si edita la pregunta, verá la ecuación original usando "self" y/o "that".
Acceso a funciones
ExpressionScript proporciona acceso a funciones matemáticas, de cadenas y definidas por el usuario, como se muestra a continuación. Tiene equivalentes de PHP y JavaScript para estas funciones, de modo que funcionan de manera idéntica en el lado del servidor (PHP) y en el lado del cliente (JavaScript). Es fácil agregar nuevas funciones.
Funciones implementadas
Actualmente están disponibles las siguientes funciones:
Function | Meaning | Syntax |
---|---|---|
abs | Absolute value | number abs(number) |
acos | Arc cosine | number acos(number) |
addslashes | Quote string with slashes | string addslashes(string) |
asin | Arc sine | number asin(number) |
atan | Arc tangent | number atan(number) |
atan2 | Arc tangent of two variables | number atan2(number, number) |
ceil | Round fractions up | number ceil(number) |
checkdate | Returns true(1) if it is a valid date in gregorian calendar | bool checkdate(month,day,year) |
convert_value | Convert a numerical value using a inputTable and outputTable of numerical values | number convert_value(fValue, iStrict, sTranslateFromList, sTranslateToList) |
cos | Cosine | number cos(number) |
count | count the number of answered (non-blank) questions in the list | number count(arg1, arg12, ..., argN) |
countif | Count the number of answered questions in the list equal to the first argument | number countif(matches, arg1, arg2, ... argN) |
countifop | Count the number of answered questions in the list which pass the criteria (arg op value) | number countifop(op, value, arg1, arg2, ... argN) |
date | Format a local date/time | string date(format [, timestamp=time()]) |
exp | Calculates the exponent of e | number exp(number) |
fixnum | Display numbers with comma as radix separator, if needed | string fixnum(number) |
floor | Round fractions down | number floor(number) |
gmdate | Format a GMT date/time | string gmdate(format [, timestamp=time()]) |
html_entity_decode | Convert all HTML entities to their applicable characters (always uses ENT_QUOTES and UTF-8) | string html_entity_decode(string) |
htmlentities | Convert all applicable characters to HTML entities (always uses ENT_QUOTES and UTF-8) | string htmlentities(string) |
expr_mgr_htmlspecialchars | Convert special characters to HTML entities (always uses ENT_QUOTES and UTF-8) | string htmlspecialchars(string) |
expr_mgr_htmlspecialchars_decode | Convert special HTML entities back to characters (always uses ENT_QUOTES and UTF-8) | string htmlspecialchars_decode(string) |
idate | Format a local time/date as integer | string idate(string [, timestamp=time()]) |
if | Excel-style if(test,result_if_true,result_if_false) | if(test,result_if_true,result_if_false) |
implode | Join array elements with a string | string implode(glue,arg1,arg2,...,argN) |
intval | Get the integer value of a variable | int intval(number [, base=10]) |
is_empty | Determine whether a variable is considered to be empty | bool is_empty(var) |
is_float | Finds whether the type of a variable is float | bool is_float(var) |
is_int | Find whether the type of a variable is integer | bool is_int(var) |
is_nan | Finds whether a value is not a number | bool is_nan(var) |
is_null | Finds whether a variable is NULL | bool is_null(var) |
is_numeric | Finds whether a variable is a number or a numeric string | bool is_numeric(var) |
is_string | Find whether the type of a variable is string | bool is_string(var) |
join (New in 2.0 build 130129) | Join elements as a new string | join(arg1, arg2, ... argN) |
list | Return comma-separated list of non-blank values | string list(arg1, arg2, ... argN) |
listifop (New in 3.16.1 ) | Return a 'glue'-separated list of the specified question property (retProp) from questions in the list which pass the criteria (cmpProp op value) | string listifop(cmpProp, op, value, retProp, glue, sgqa1, sgqa2, ... sgqaN) |
ltrim | Strip whitespace (or other characters) from the beginning of a string | string ltrim(string [, charlist]) |
max | Find highest value | number max(arg1, arg2, ... argN) |
min | Find lowest value | number min(arg1, arg2, ... argN) |
mktime | Get UNIX timestamp for a date (each of the 6 arguments are optional) | number mktime([hour [, minute [, second [, month [, day [, year ]]]]]]) |
modulo-function | The modulo function is not supported yet. You can use the floor() function instead | floor(x/y)==(x/y) |
nl2br | Inserts HTML line breaks before all newlines in a string | string nl2br(string) |
number_format | Format a number with grouped thousands | string number_format(number) |
pi | Get value of pi | number pi() |
pow | Exponential expression | number pow(base, exp) |
quoted_printable_decode | Convert a quoted-printable string to an 8 bit string | string quoted_printable_decode(string) |
quoted_printable_encode | Convert a 8 bit string to a quoted-printable string | string quoted_printable_encode(string) |
quotemeta | Quote meta characters | string quotemeta(string) |
rand | Generate a random integer, see this example | int rand() OR int rand(min, max) |
regexMatch | compare a string to a regular expression | bool regexMatch(pattern,input) |
round | Rounds a number to an optional precision | number round(val [, precision]) |
rtrim | Strip whitespace (or other characters) from the end of a string | string rtrim(string [, charlist]) |
sin | Sine | number sin(arg) |
sprintf | Return a formatted string | string sprintf(format, arg1, arg2, ... argN) |
sqrt | Square root | number sqrt(arg) |
stddev | Calculate the Sample Standard Deviation for the list of numbers | number stddev(arg1, arg2, ... argN) |
str_pad | Pad a string to a certain length with another string | string str_pad(input, pad_length [, pad_string]) |
str_repeat | Repeat a string | string str_repeat(input, multiplier) |
str_replace | Replace all occurrences of the search string with the replacement string | string str_replace(search, replace, subject) |
strcasecmp | Binary safe case-insensitive string comparison | int strcasecmp(str1, str2) |
strcmp | Binary safe string comparison | int strcmp(str1, str2) |
strip_tags | Strip HTML and PHP tags from a string | string strip_tags(str, allowable_tags) |
stripos | Find position of first occurrence of a case-insensitive unicode string (starting by 0, return false if not found) | int stripos(haystack, needle [, offset=0]) |
stripslashes | Un-quotes a quoted string | string stripslashes(string) |
stristr | Case-insensitive strstr | string stristr(haystack, needle [, before_needle=false]) |
strlen | Get string length | int strlen(string) |
strpos | Find position of first occurrence of an unicode string (starting by 0, return false if not found) | int strpos(haystack, needle [ offset=0]) |
strrev | Reverse a string | string strrev(string) |
strstr | Find first occurrence of a string | string strstr(haystack, needle[, before_needle=false]) |
strtolower | Make a string lowercase | string strtolower(string) |
strtotime | Parse about any English textual datetime description into a Unix timestamp | int strtotime(string) |
strtoupper | Make a string uppercase | string strtoupper(string) |
substr | Return part of an unicode string | string substr(string, start [, length]) |
sum | Calculate the sum of values in an array | number sum(arg1, arg2, ... argN) |
sumifop | Sum the values of answered questions in the list which pass the criteria (arg op value) | number sumifop(op, value, arg1, arg2, ... argN) |
tan | Tangent | number tan(arg) |
time | Return current UNIX timestamp | number time() |
trim | Strip whitespace (or other characters) from the beginning and end of a string | string trim(string [, charlist]) |
ucwords | Uppercase the first character of each word in a string | string ucwords(string) |
unique | Returns true if all non-empty responses are unique | boolean unique(arg1, ..., argN) |
Crear nuevas funciones de expresión con el complemento (New in 4.0.0 )
Si necesita una nueva función que no existe en el núcleo, puede crear una con un complemento. Esta nueva función se crea utilizando el evento expressionManagerStart.
ExpressionScript sabe qué variables son locales
Para crear correctamente JavaScript para una página, EM necesita saber qué variables están configuradas en la página y cuál es su ID de JavaScript (por ejemplo, para document.getElementById(x)). También debe saber qué variables están configuradas en otras páginas (para poder garantizar que se cumplan las condiciones necesarias<input type='hidden' value='x'> los campos están presentes y poblados).
Condiciones en cascada
Si alguna de las variables es irrelevante, toda la ecuación será irrelevante (falsa). Por ejemplo, en la siguiente tabla, N/A significa que una de las variables no era relevante:
Operador | Ejemplo | a | b | Resultado | |||||
---|---|---|---|---|---|---|---|---|---|
+ (unario) | +a | N/A | falso | ||||||
! | !a | N/A | falso | ||||||
== (o eq) | a == b | N/A | 5 | falso | |||||
== (o eq) | a == b | N/A | 0 | falso | |||||
== (o eq) | a == b | N/A | N/A | falso | |||||
!= (o ne) | a != b | N/A | 5 | falso | |||||
!= (o ne) | a != b | N/A | N/A | falso | |||||
!= (o ne) | a != b | N/A | 0 | falso | |||||
> (o gt) | a >b | N/A | 5 | falso | |||||
>= (o ge) | a >= b | N/A | 5 | falso | |||||
< (o lt) | a < b | N/A | 5 | falso | |||||
<= (o le) | a <= b | N/A | 5 | falso | |||||
y | a y b | N/A | 5 | falso | |||||
y | a y b | N/A | N/A | - | o | a o b | N/A | N/A | falso |
o | a o b | N/A | 5 | falso | |||||
+ | a + b | N/A | 5 | falso | |||||
* | a * b | N/A | 5 | falso | |||||
/ | a / b | 5 | N/A | falso | |||||
(exp) | (a && b) | N/A | 5 | falso | |||||
|(b + b) > (a && b) | N/A | 5 | falso | ||||||
función | suma(a,b,b) | N/A | 5 | falso | |||||
función | max(a,b) | N/A | 5 | falso | |||||
función | min(a,b ) | N/A | 5 | falso | |||||
función | implosionar(', ',a,b,a,b) | N/A | 5 | - | función | si(a,a,b) | N/A | 5 | falso |
función | está_vacío(a) | N/ Un | falso | ||||||
función | is_empty(a) | 0 (o en blanco) | verdadero | ||||||
función | !is_empty(a) | N/A | falso |
Anulación de condiciones en cascada
Supongamos que desea mostrar un total acumulado de todas las respuestas relevantes. Podrías intentar utilizar la ecuación {suma(q1,q2,q3,...,qN)}. Sin embargo, esto se traduce internamente a LEMif(LEManyNA("q1","q2","q3",...,"qN")",",sum(LEMval("q1"),LEMval("q2") ,LEMval("q3"),...,LEMval("qN"))). Entonces, si alguno de los valores q1-qN es irrelevante, la ecuación siempre devolverá falso. En este caso, sum() mostrará "0" hasta que se respondan todas las preguntas.
Para evitar esto, a cada variable se le puede agregar un sufijo ".NAOK" (lo que significa que No aplicable está bien). En tales casos, se produce el siguiente comportamiento. Supongamos que tiene una variable q1.NAOK:
- q1 no se agrega a la cláusula LEManyNA()
- LEMval('q1') continuará verificando si la respuesta es relevante y devolverá "" si no es así (las respuestas individuales irrelevantes serán ignoradas, pero no anularán la expresión completa).
Entonces, la solución al problema del total acumulado es usar la ecuación suma(q1.NAOK,q2.NAOK,q3.NAOK,...,qN.NAOK).
El uso del sufijo .NAOK también permite a los autores diseñar encuestas que tienen varias rutas posibles pero que luego convergen en rutas comunes. Por ejemplo, digamos que los sujetos responden una encuesta de una manera que está fuera del rango normal de respuestas. El autor podría alertar a los sujetos de que es posible que no obtengan resultados válidos y preguntarles si realmente quieren continuar con la encuesta. Si dicen "Sí", se mostrarán el resto de las preguntas. La condición para el "resto de las preguntas" verificaría si las respuestas iniciales fueron respondidas dentro del rango normal O si el sujeto dijo "Sí" a la pregunta que solo es relevante si respondió fuera del rango normal.
¿Cómo admite ExpressionScript la microadaptación condicional?
A continuación se muestra un ejemplo de microadaptación (donde Tipo de pregunta=='expr' significa una Ecuación):
Código de pregunta | Relevancia | Tipo de pregunta | Pregunta |
---|---|---|---|
nombre | 1 | texto | ¿Cuál es tu nombre? |
badage | !is_empty(edad) | expr | {(edad<16) o (edad>80 )} |
agestop | badage | message | Lo siento, {nombre}, tú también eres {if( (edad<16),'joven',if( (edad>80), 'viejo','mediana edad') ) } para esta prueba. |
kids | !badage | yesno | ¿Tienes hijos? |
padres | 1 | expr | {!badage && kids=='Y'} |
numKids | parents | text | ¿Cuántos hijos tienes? |
kid2 | parents && numKids >= 2 | text | ¿Cuántos años tiene? tu segundo hijo? |
kid3 | parents && numKids >= 3 | text | ¿Cuántos años tiene tu tercer hijo? |
kid4 | parents && numKids > = 4 | text | ¿Cuántos años tiene tu cuarto hijo? |
kid5 | parents && numKids >= 5 | text | ¿Cuántos años tiene tu quinto hijo? |
informe | |text | {nombre}, dijiste que tienes {edad} y que tienes {numKids}. La suma de las edades de tus primeros {min(numKids,5)} hijos es {sumage} |
Para descargar el ejemplo de encuesta anterior, haga clic en el siguiente enlace: Ejemplo de encuesta sobre número de niños.
Todas estas preguntas pueden estar en una sola página (por ejemplo, en el mismo grupo) y solo se mostrarán las preguntas relevantes. Además, a medida que ingresa las edades de los niños, la expresión sum() en la última pregunta se actualizará dinámicamente.
<html>ExpressionScript proporciona esta funcionalidad al rodear cada expresión con un nombre elemento. Cada vez que un valor cambia, vuelve a calcular la expresión que debería aparecer en ese elemento y regenera la pantalla. Puede tener docenas o incluso cientos de expresiones personalizadas en la misma página.
Resaltado de sintaxis
Para ayudar a ingresar y validar expresiones, EM proporciona resaltado de sintaxis con las siguientes características:
Tipos y significados del resaltado de sintaxis
Color | Muestra | Significado | Información sobre herramientas | Comentarios | ||||
---|---|---|---|---|---|---|---|---|
fondo tostado | Muestra | el ecuación completa | ninguno | -! N!|texto rojo en negrita | Muestra | Un error | Alguna explicación sobre el error | Puede ser una variable desconocida o un error en la función. La encuesta está rota y las preguntas que se basan en la expresión respectiva no se mostrarán a los encuestados. |
blue text | Muestra | nombre de función | significado y sintaxis permitida | Se refiere a nombres de funciones o cosas que deberían ser funciones ya que van seguidas de un paréntesis abierto. Se muestran en texto azul en negrita. La información sobre herramientas muestra el significado y la sintaxis permitida para la función. | ||||
grey text | Muestra | cadena | none | Las cadenas entre comillas simples y dobles se muestran en texto gris. | ||||
texto cian | Muestra | variable configurada en la misma página, | [ nombre o código SGQA]: pregunta; valor; Lista de respuestas que muestra códigos para cada valor | Cualquier variable que esté configurada en la misma página que la pregunta que estás editando actualmente se muestra en texto cian (se puede actualizar en javascript). La información sobre herramientas muestra su nombre (si usó INSERTANS:xxx) o su código SGQA (si usó el nuevo sistema de nombres), la pregunta real y su valor actual (o en blanco si no está configurado). Si el tipo de pregunta espera respuestas de un conjunto de valores enumerados, se muestra la asignación de los códigos para mostrar valores. | ||||
green text | Muestra | variable establecida en una página anterior | [ nombre o código SGQA]: pregunta; valor; respuestaLista que muestra códigos para cada valor | Cualquier variable que se establezca en una página anterior se muestra en texto verde en negrita. La información sobre herramientas muestra su nombre (si usó INSERTANS:xxx) o el código SGQA (si usó el nuevo sistema de nombres), la pregunta real y su valor actual (o en blanco si no está configurado). Si el tipo de pregunta espera respuestas de un conjunto de valores enumerados, se muestra la asignación de los códigos para mostrar valores. | ||||
bold pink text | Muestra | variable establecida en una página posterior en general: vacía al inicio de la encuesta, pero se puede completar con un índice o pasar a la anterior | [ nombre o código SGQA]: pregunta; valor; Lista de respuestas que muestra códigos para cada valor | Cualquier variable que se establezca en una página anterior se muestra en texto rosa en negrita. La información sobre herramientas muestra su nombre (si usó INSERTANS:xxx) o el código SGQA (si usó el nuevo sistema de nombres), la pregunta real y su valor actual (o en blanco si no está configurado). Si el tipo de pregunta espera respuestas de un conjunto de valores enumerados, la asignación de los códigos para mostrar valores es show. | ||||
bold tan text | Muestra | un valor de reemplazo de lima | el valor | Las cadenas de reemplazo de lima (como {TOKEN:xxx}, {PRIVACY_MESSAGE}) se muestran en texto tostado en negrita. | ||||
texto rojo | Muestra | operador de asignación (=) | mensaje de advertencia | Si utiliza uno de los operadores de asignación (=), ese operador se mostrará en texto rojo. Esto está destinado a ayudar a evitar la reasignación accidental de valores cuando realmente quería verificar si a == b en lugar de establecer el valor de a = b. | ||||
normal black text | Muestra | puntuación | none | Todos los demás signos de puntuación dentro de la expresión se muestran como texto negro normal. | ||||
texto en cuadro rojo | una línea roja en negrita rodea el error | error de sintaxis | descripción del error | Cualquier error de sintaxis detectado se muestra dentro de cuadros rojos. La información sobre herramientas muestra el error. Los ejemplos incluyen paréntesis no coincidentes, uso de funciones no definidas, pasar el número incorrecto de argumentos a funciones, expresiones mal estructuradas (por ejemplo, operadores faltantes entre variables), intentar asignar un nuevo valor a una variable de sólo lectura, intentar asignar valores a variables no definidas. -variables o usar sintaxis no compatible. Tenga en cuenta que el sistema de detección de errores de sintaxis solo puede informar un error en una expresión incluso si hay varios errores; sin embargo, si se detecta algún error, se mostrará al menos uno. |