A previous post me llevó a publicar esta pregunta. Parecería una buena práctica reasignar ==
a isTRUE(all.equal())
(y !=
a !isTRUE(all.equal())
. Me pregunto si otros lo hacen en la práctica? Me acabo de dar cuenta de que uso ==
y !=
para hacer igualdad numérica en mi código base. Mi primera reacción fue que necesito hacer un scrub completo y convertirme a all.equal
. Pero de hecho, cada vez que uso ==
y !=
quiero probar la igualdad (independientemente del tipo de datos). De hecho, no estoy seguro de qué probarían estas operaciones para otro que no sea la igualdad. Estoy seguro de que me falta algún concepto aquí. ¿Puede alguien aclararme? El único argumento que veo en contra de este enfoque es que en algunos casos dos números no idénticos parecerán ser idénticos debido a la tolerancia de all.equal
. Pero nos dicen que dos números que son de hecho idénticos podrían no pasar identical()
debido a cómo están almacenados en la memoria. Entonces, ¿cuál es el punto de no incumplir de manera predeterminada con all.equal
?¿Has reasignado == y! = A isTRUE (all.equal())?
Respuesta
Como aludió a @joran, se encontrará con problemas de punto flotante con ==
y !=
en casi cualquier otro idioma también. Un aspecto importante de ellos en R es la parte de vectorización.
Sería mucho mejor definir una nueva función almostEqual
, fuzzyEqual
o similar. Es desafortunado que no exista tal función base. all.equal
no es muy eficiente, ya que maneja todo tipo de objetos y devuelve una cadena que describe la diferencia cuando en su mayoría solo desea TRUE
o FALSE
.
Aquí hay un ejemplo de dicha función. Se ha vectorizado como ==
.
almostEqual <- function(x, y, tolerance=1e-8) {
diff <- abs(x - y)
mag <- pmax(abs(x), abs(y))
ifelse(mag > tolerance, diff/mag <= tolerance, diff <= tolerance)
}
almostEqual(1, c(1+1e-8, 1+2e-8)) # [1] TRUE FALSE
... que es de alrededor de 2 veces más rápido que all.equal
para valores escalares, y mucho más rápido con vectores.
x <- 1
y <- 1+1e-8
system.time(for(i in 1:1e4) almostEqual(x, y)) # 0.44 seconds
system.time(for(i in 1:1e4) all.equal(x, y)) # 0.93 seconds
Tommy - después de algunas pruebas creo que hay un error en esta función. Considere: matrixa = round (matriz (rnorm (9), nrow = 3, ncol = 3), 6) matrixb = matrixa - .001 almostEqual (matrixa, matrixb, tolerance = .001) – SFun28
Incluso esto produce FALSE algunas veces: almostEqual (matrixa, matrixb, tolerance = .01) – SFun28
@ SFun28 - Creo que el código es correcto. Pruebe 'all.equal' en su lugar y también no es VERDADERO. Es porque es una tolerancia RELATIVA.'rnorm' puede dar números grandes (3.5) o pequeños (0.0003), pero el error que agregue a matrixb siempre es' 0.001'. Pruebe con 'matrixb <- matrixa * 1.001' en su lugar. – Tommy
- 1. ¿Cuál es la diferencia en R entre idéntico (x, y) e isTRUE (all.equal (x, y))?
- 2. ¿Has integrado Mantis y Subversion?
- 3. ¿Has empezado a usar C++ 0x?
- 4. HAS-A, terminología IS-A en lenguaje orientado a objetos
- 5. ¿Has utilizado JustCode?
- 6. Has-Muchos relación sólo
- 7. ¿Para qué has usado Object.clone()?
- 8. ¿Has encontrado Y dado X en una Curva Bezier cúbica?
- 9. ¿Qué git gotchas has sido atrapado?
- 10. Entonces, ¿qué emocionantes algoritmos has "descubierto" recientemente?
- 11. ¿Qué macros útiles has creado en Netbeans?
- 12. fixture_file_upload has {file} no existe error
- 13. ¿Has configurado ClickListener para el elemento giratorio?
- 14. Gradle: War Task has Conflicting Includes/Excludes
- 15. ¿CSS tiene algo como jQuery's: has()?
- 16. Resultado inesperado de all.equal.POSIXct
- 17. DataTable decorada con Bootstrap en inactivo Tab Has Narrow Header
- 18. Sphinx: cuándo usar 'has' e 'indexes' para los campos
- 19. ¿Existe una restricción Has-Only-One en NUnit?
- 20. ¿Por qué los pseudos funcionales tales como: not() y: has() permiten argumentos entrecomillados?
- 21. Rails has-many-through equivalent en ASP.NET MVC3
- 22. ¿Has escrito funciones muy largas? Si es así, ¿por qué?
- 23. ¿Cuál es la pieza de código más importante que has escrito y cómo te acercas?
- 24. ¿Has convertido de subversión a mercurial? ¿Valió la pena el esfuerzo?
- 25. Usuarios de @Rails: ¿has probado web2py? Pros? ¿Contras?
- 26. ¿Has abierto el archivo nautilus en el nuevo buffer gvim?
- 27. Usuarios de Gallio, ¿qué ventajas y desventajas has experimentado al utilizar esta herramienta?
- 28. ¿Qué es lo mejor que has hecho con vim que ayudó a tu programación?
- 29. ¿Has utilizado Intersystems Caché? ¿Cuál es tu experiencia?
- 30. ¿Para qué has usado las macros de Scheme?
Eso parecía una cosa tan extraña que hacer, entonces me leyó la nota en la página de ayuda Comparación: "No usar == y = para las pruebas, como en el caso de las expresiones, en el que debe tener una! solo VERDADERO o FALSO. A menos que esté absolutamente seguro de que no puede pasar nada inusual, debe usar la función idéntica en su lugar ". Entonces tal vez no sea una idea tan absurda. –
Voy a decir que no, no deberías. Use 'idéntico' en su lugar, y mantenga '==' para las comparaciones vectorizadas al subconjunto. – joran
Si comienza a sobrecargar operadores comunes, su código será seriamente no portátil. Es mucho mejor aprender qué hace cada operador o función y usar la herramienta adecuada para el trabajo correcto. –