简体   繁体   English

如何在R中绘制用户定义的函数?

[英]How to plot user-defined functions in R?

I am supposed to write a function for Stirling Numbers of the Second Kind, given by the formula: 我应该为第二类斯特林数写一个函数,由下式给出:

在此输入图像描述

For this, I have written the following function in R: 为此,我在R中编写了以下函数:

stirling <- function(n, k)
{
  sum = 0
  for (i in 0:k)
  {
    sum = sum + (-1)^(k - i) * choose(k, i) * i^n
  }
  sum = sum / factorial(k)
  return(sum)
}

The next part of the question is to "create a plot for n = 20, k = 1,2,...,10" . 问题的下一部分是“为n = 20创建一个图,k = 1,2,...,10” I did some research and I think the methods curve or plot might help me. 我做了一些研究,我认为方法curveplot可能对我有帮助。 However, I am guessing these methods are used when y is of the form f(x) (ie a single argument). 但是,我猜这些方法是在yf(x)形式时使用的(即单个参数)。 But here, I have two arguments ( n and k ) in my function stirling so I am not sure how to approach this. 但在这里,我有两个参数( nk )在我的功能stirling ,所以我不知道如何处理这一点。

Also, I tried converting the values of k (0, 1, 2..., 10) to a vector and then passing them to stirling , but stirling won't accept vectors as input. 此外,我尝试将k (0,1,2 ...,10)的值转换为矢量,然后将它们传递给stirling ,但stirling将不接受矢量作为输入。 I am not sure how to modify the code to make stirling accept vectors. 我不知道如何修改代码以使stirling接受向量。

Any suggestions? 有什么建议么?

Vectorize 矢量化

As pointed out in the comments, you can vectorize to do this: 正如评论指出的那样,你可以vectorize做到这一点:

Vectorize creates a function wrapper that vectorizes the action of its argument FUN. Vectorize创建一个函数包装器,用于向量化其参数FUN的动作。 Vectorize(FUN, vectorize.args = arg.names, SIMPLIFY = TRUE, USE.NAMES = TRUE)

(vstirling <- Vectorize(stirling))
# function (n, k) 
# {
# args <- lapply(as.list(match.call())[-1L], eval, parent.frame())
# names <- if (is.null(names(args))) 
#     character(length(args))
# else names(args)
# dovec <- names %in% vectorize.args
# do.call("mapply", c(FUN = FUN, args[dovec], MoreArgs = list(args[!dovec]), 
#    SIMPLIFY = SIMPLIFY, USE.NAMES = USE.NAMES))
# }

so vstirling() is the vectorized version of stirling() . 所以vstirling()stirling()的矢量化版本。

vstirling(20, 1:10)
 # [1] 1.000000e+00 5.242870e+05 5.806064e+08 4.523212e+10 7.492061e+11 4.306079e+12 1.114355e+13 1.517093e+13
 # [9] 1.201128e+13 5.917585e+12

Now all that is left is creating a plot: 现在剩下的就是创建一个情节:

plot(x = 1:10, y = vstirling(20, 1:10), ylab = "S(20, x)", xlab = "x")

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM