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

9

我需要编写一个斯特林第二类数的函数,它的公式如下:

enter image description here

为此,我在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)
}

下一步问题是“为n = 20,k = 1,2,…,10创建一个图形”。我做了一些研究,认为方法curveplot可能对我有帮助。但是,我猜测这些方法是在yf(x)的形式(即单个参数)时使用的。但是,在这里,我的函数stirling有两个参数(nk),所以我不确定如何处理它。
此外,我尝试将k的值(0,1,2 ..., 10)转换为向量,然后将其传递给stirling,但是stirling不会接受向量作为输入。我不确定如何修改代码来使stirling接受向量。
有什么建议吗?

5
请查看“向量化(Vectorize)”帮助页面。 - IRTFM
1
更具体地说,类似于 plot(1:10, Vectorize(stirling)(20, 1:10)) - MrFlick
当你使用多对参数时,apply() 是适用的。例如,df <- expand.grid(n = 18:22, k = 1:10); res <- apply(df, 1, function(x) stirling(x[1], x[2])); df <- cbind(df, res) - cuttlefish44
1个回答

5

向量化

正如评论中所指出的,您可以使用 向量化 来完成此操作:

向量化创建一个函数包装器,将其参数FUN的操作向量化。 向量化(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))
# }

因此,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

现在只需创建一个图表:
plot(x = 1:10, y = vstirling(20, 1:10), ylab = "S(20, x)", xlab = "x")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接