How to make object created within function usable outside

前端 未结 4 679
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-12-12 23:29

I created a function which produces a matrix as a result, but I can\'t figure out how to make the output of this function usable outside of the function environment, so that

相关标签:
4条回答
  • 2020-12-13 00:05

    Can't you just use <<- to assign it the object to the workspace? The following code works for me and saves the amort_value object.

    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
    
    0 讨论(0)
  • 2020-12-13 00:20

    That's easy: use <<- for assignment to a global.

    But then again, global assignment is evil and not functional. Maybe you'd rather return a list with several results from your function? Looking at your code, it seems that your second function may confuse the return and print. Make sure you return the correct data structure.

    0 讨论(0)
  • 2020-12-13 00:27

    At the end of the function, you can return the result.

    First define the function:

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

    Then call it and assign the output to a variable:

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

    From here on use scoreRange in the environment. Any variables or nested functions within your defined function is not accessible to the outside, unless of course, you use <<- to assign a global variable. So in this example, you can't see what numRange is from the outside unless you make it global.

    Usually, try to avoid global variables at an early stage. Variables are "encapsulated" so we know which one is used within the current context ("environment"). Global variables are harder to tame.

    0 讨论(0)
  • 2020-12-13 00:28

    A little about functional programming. First of all, when you define your function:

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

    know that when the function is called it will never reach the print statement. Instead, it will exit right before, with return. So you can remove that print statement, it is useless.

    Now the more important stuff. Inside your function, you define and return my.matrix. The object only exists within the scope of the function: as the function exits, what is returned is an unnamed object (and my.matrix is lost.)

    In your session, when you call

    getTitles(mypages)
    

    the result is printed because you did not assign it. Instead, you should do:

    out.matrix <- getTitles(mypages)
    

    Now the result won't be printed but you can definitely do so by typing print(out.matrix) or just out.matrix on a single line. And because you have stored the result in an object, you can now reuse it for further manipulations.

    If it help you grasp the concept, this is all the same as calling the c() function from the command line:

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

    Bonus: Really, I don't think you need to define getTitles, but you can use one of the *apply functions. I would try this:

    url    <- as.character(mypages)
    title  <- sapply(url, getTitle)
    report <- data.frame(url, title)
    write.csv(report, file = "report.csv", row.names = FALSE)
    
    0 讨论(0)
提交回复
热议问题