[R-es] Trabajar con un argumento opcional como escalar o vector.

Emilio Torres Manzanera torres en uniovi.es
Jue Mayo 16 22:56:13 CEST 2013


Hola,
Al final encontré una posible solución. La reseño aquí por si le sirve a alguien más. Gracias. Emilio

library(xkcd)
?doforeachrow  

On Tuesday, April 30 2013, 21:37:36, Carlos J. Gil Bellosta <cgb en datanalytics.com> wrote:

> Pues entonces igual puedes pegar temporalmente ese vector de
> parámetros en la tabla de entrada (con cbind) y pasarle a tu función
> el valor de esa columna fila a fila como un argumento --atómico ya--
> más.
>
> Un saludo,
>
> Carlos J. Gil Bellosta
> http://www.datanalytics.com
>
> El día 30 de abril de 2013 20:36, Emilio Torres Manzanera
> <torres en uniovi.es> escribió:
>>>> On Tuesday, April 30 2013, 19:44:58, Carlos J. Gil Bellosta <cgb en datanalytics.com> wrote:
>>
>>> ¿El vector de argumentos es igual de largo que la tabla?
>>>
>>> Un saludo,
>>>
>>> Carlos J. Gil Bellosta
>>> http://www.datanalytics.com
>>>
>>> El día 30 de abril de 2013 19:13, Emilio Torres Manzanera
>>> <torres en uniovi.es> escribió:
>>>>
>>>> Estimada Lista,
>>>>
>>>> Deseo aplicar una función a cada fila de un data frame con un argumento opcional.
>>>> En la función orginal, el argumento opcional debería poder ser escalar o vector.
>>>>
>>>> Necesito definir una función 'aplicaratodasfilas' que llama a otra función 'atomica' que no admite vectores y que requiere también argumentos opcionales.
>>>> Pongo un ejemplo:
>>>>
>>>>
>>>> # Se aplica a cada fila.
>>>> atomica <- function(xbegin, xend, npoints = 5, ...) { # los argumentos opcionales ... son necesarios ya que hay más funciones dentro
>>>>   seq(xbegin,xend,length.out = npoints) # la función seq no admite vectores
>>>> }
>>>>
>>>>
>>>> aplicaratodaslasfilas <- function(data, ...) {
>>>>   lapply(1:dim(data)[1], function(i,...) {
>>>>     atomica(xbegin=data[i,1], xend=data[i,2], ...)
>>>>   }, ... = ...
>>>>          )
>>>> }
>>>>
>>>> data <- data.frame(xbegin=c(1:2),xend=c(11:12))
>>>> aplicaratodaslasfilas(data=data) # FUNCIONA
>>>> ## [[1]]
>>>> ## [1]  1.0  3.5  6.0  8.5 11.0
>>>>
>>>> ## [[2]]
>>>> ## [1]  2.0  4.5  7.0  9.5 12.0
>>>>
>>>> aplicaratodaslasfilas(data=data, npoints = 3) # FUNCIONA
>>>> ## [[1]]
>>>> ## [1]  1  6 11
>>>>
>>>> ## [[2]]
>>>> ## [1]  2  7 12
>>>>
>>>> aplicaratodaslasfilas(data=data, npoints = c(3,5)) # NO FUNCIONA
>>>> # Me gustaría obtener
>>>> ## [[1]]
>>>> ## [1]  1  6 11
>>>>
>>>> ## [[2]]
>>>> ## [1]  2.0  4.5  7.0  9.5 12.0
>>>>
>>>> ¿Alguien sabría definir la función aplicaracadafila de tal forma que funcione en estos casos?
>>>> aplicaratodaslasfilas(data=data)
>>>> aplicaratodaslasfilas(data=data, npoints = 3)
>>>> aplicaratodaslasfilas(data=data, npoints = c(3,5))
>>>>
>>>> Gracias
>>>> Emilio
>>>>
>>>> _______________________________________________
>>>> R-help-es mailing list
>>>> R-help-es en r-project.org
>>>> https://stat.ethz.ch/mailman/listinfo/r-help-es
>>
>>
>> --
>> =================================================
>> Emilio Torres Manzanera
>> Fac. de Comercio - Universidad de Oviedo
>> c/ Luis Moya 261, E-33203 Gijón (Spain)
>> Tel. 985 182 197 email: torres en uniovi.es
>> =================================================


-- 
=================================================
Emilio Torres Manzanera
Fac. de Comercio - Universidad de Oviedo
c/ Luis Moya 261, E-33203 Gijón (Spain)
Tel. 985 182 197 email: torres en uniovi.es



Más información sobre la lista de distribución R-help-es