style div dashboardpage color r function global-variables environment-variables

dashboardpage - tags$div shiny



Cómo hacer que el objeto creado dentro de la función sea utilizable fuera. (4)

¿No puedes usar <<- para asignarle el objeto al área de trabajo? El siguiente código funciona para mí y guarda el objeto amort_value .

amortization <- function(cost, downpayment, interest, term) { amort_value <<- (cost)*(1-downpayment/100)*(interest/1200)*((1+interest/1200)^(term*12))/((1+interest/1200)^(term*12)-1) sprintf("$%.2f", amort_value) } amortization(445000,20,3,15) amort_value

Como resultado, creé una función que produce una matriz, pero no puedo entender cómo hacer que la salida de esta función sea utilizable fuera del entorno de la función, por lo que, por ejemplo, podría guardarla en un archivo csv.

Mi código para la función es el siguiente:

Función creada que toma las URL de un sitio específico y devuelve el título de la página:

getTitle <- function(url) { webpage <- readLines(url) first.row <- webpage[1] start <- regexpr("<title>", first.row) end <- regexpr("</title>", first.row) title <- substr(first.row,start+7,end-1) return(title) }

función creada que toma el vector de urls y devuelve n * 2 matriz con urls y títulos de página:

getTitles <- function(pages) { my.matrix <- matrix(NA, ncol=2, nrow=nrow(pages)) for (i in seq_along(1:nrow(pages))) { my.matrix[i,1] <- as.character(pages[i,]) my.matrix[i,2] <- getTitle(as.character(pages[i,])) } return(my.matrix) print(my.matrix)}

Después de ejecutar estas funciones en un archivo de ejemplo desde aquí http://goo.gl/D9lLZ que importo con la función read.csv y nombre "mypages", obtengo el siguiente resultado:

getTitles(mypages) [,1] [,2] [1,] "http://support.google.com/adwords/answer/1704395" "Create your first ad campaign - AdWords Help" [2,] "http://support.google.com/adwords/answer/1704424" "How costs are calculated in AdWords - AdWords Help" [3,] "http://support.google.com/adwords/answer/2375470" "Organizing your account for success - AdWords Help"

Esto es exactamente lo que necesito, pero me encantaría poder exportar esta salida a un archivo csv o reutilizarla para futuras manipulaciones. Sin embargo, cuando intento imprimir (my.matrix), aparece un error que dice "Error: no se encontró el objeto ''my.matrix''"

Siento que es un vacío bastante básico en mi conocimiento, pero no he estado trabajando con R por un tiempo y no pude resolverlo.

¡Gracias! Sergey


Al final de la función, puede return el resultado.

Primero define la función:

getRangeOf <- function (v) { numRange <- max(v) - min(v) return(numRange) }

Luego llámalo y asigna la salida a una variable:

scores <- c(60, 65, 70, 92, 99) scoreRange <- getRangeOf(scores)

A partir de aquí utilizamos scoreRange en el entorno. Cualquier variable o función anidada dentro de su función definida no es accesible desde el exterior, a menos que, por supuesto, use <<- para asignar una variable global. Entonces, en este ejemplo, no puedes ver qué es numRange desde afuera a menos que lo hagas global.

Por lo general, trate de evitar las variables globales en una etapa temprana. Las variables están "encapsuladas", por lo que sabemos cuál se usa dentro del contexto actual ("entorno"). Las variables globales son más difíciles de domesticar.


Eso es fácil: use <<- para la asignación a un global.

Pero, de nuevo, la asignación global es malvada y no funcional. ¿Tal vez prefieres devolver una lista con varios resultados de tu función? Mirando su código, parece que su segunda función puede confundir la return y la print . Asegúrese de devolver la estructura de datos correcta.


Un poco sobre la programación funcional. En primer lugar, cuando definas tu función:

getTitles <- function(pages) { [...] return(my.matrix) print(my.matrix) }

sepa que cuando se llama a la función, nunca llegará a la declaración de print . En cambio, saldrá justo antes, con return . Así que puedes eliminar esa declaración print , es inútil.

Ahora lo más importante. Dentro de su función, usted define y devuelve my.matrix . El objeto solo existe dentro del alcance de la función: a medida que la función sale, lo que se devuelve es un objeto sin nombre (y my.matrix se pierde).

En tu sesión, cuando llames.

getTitles(mypages)

El resultado se imprime porque no lo asignaste. En su lugar, debe hacer:

out.matrix <- getTitles(mypages)

Ahora el resultado no se imprimirá, pero definitivamente puede hacerlo escribiendo print(out.matrix) o simplemente out.matrix en una sola línea. Y como ha almacenado el resultado en un objeto, ahora puede reutilizarlo para manipulaciones adicionales .

Si te ayuda a comprender el concepto, es lo mismo que llamar a la función c() desde la línea de comando:

c(1, 5, 2) # will return and print a vector x <- c(1, 5, 2) # will return and assign a vector (not printed.)

Bonus: Realmente, no creo que necesites definir getTitles , pero puedes usar una de las *apply funciones de *apply . Yo intentaría esto:

url <- as.character(mypages) title <- sapply(url, getTitle) report <- data.frame(url, title) write.csv(report, file = "report.csv", row.names = FALSE)