【问题标题】:R: Error in get(as.character(FUN), mode = "function", envir = envir) :R:获取错误(as.character(FUN),mode =“function”,envir = envir):
【发布时间】:2021-10-01 10:16:46
【问题描述】:

我正在与 R 合作。我正在尝试在此处复制此 stackoverflow 帖子中提供的答案:How can I plot 3D function in r?

使用 R 中的“lattice”库,我正在尝试创建“input_1”、“input_2”、“input_3”的 3D 曲面图 - 并根据“final_value”的值对曲面着色。

我为这个问题创建了一个函数:

my_function_b <- function(input_1, input_2, input_3, input_4) {
    
    final_value = sin(input_1) + cos(input_2) + input_3 + input_4
    
}

然后,我为这个函数的每个“输入”分配了一系列值:

input_1 <- seq(-10, 10, length= 30)
input_2 <- input_1
input_3 <- input_1
input_4 <- input_1

接下来,我尝试使用“外部”功能:

z <- outer(input_1, input_2, input_3, my_function_b)

但这会返回以下错误:

Error in get(as.character(FUN), mode = "function", envir = envir) : 
  object 'input_3' of mode 'function' was not found

谁能告诉我我做错了什么?

谢谢

其他参考资料:

【问题讨论】:

    标签: r plot 3d data-visualization


    【解决方案1】:

    outer 只接受两个参数。我们可能需要pmap

    library(purrr)
    pmap_dbl(list(input_1, input_2, input_3, input_4), my_function_b)
    

    Map/mapply

    mapply(my_function_b, input_1, input_2, input_3, input_4)
    

    如果我们需要所有组合,请使用 expand.grid 创建组合并应用于行

    tmp <- expand.grid(input_1 = input_1, input_2 = input_2, 
         input_3 = input_3, input_4 = input_4)
    out <- apply(tmp, 1, 
           FUN = function(x) do.call(my_function_b, as.list(x)))
    

    或者可以从collapse 使用dapply 加速

    library(collapse)
    
    out1 <- dapply(tmp, MARGIN = 1, FUN = function(x) 
                my_function_b(x[1], x[2], x[3], x[4]))
    

    也许,我们在两个向量上创建组合,然后添加?

    my_function_b <- function(input_1, input_2) sin(input_1) + cos(input_2)
    tmp1 <- outer(input_1, input_2, my_function_b)
    z <- tmp1 + input_3[col(tmp1)] + input_4[col(tmp1)]
    library(lattice)
    wireframe(z, drape=TRUE, col.regions=rainbow(100))
    

    -输出

    【讨论】:

    • 感谢您的回复!我试图运行你的代码“out
    • @Noob 对我来说,它花了user system elapsed 5.615 0.075 5.631。和length(out)# [1] 810000。只是因为你有 4 个向量组合
    • @Noob 你能用dapply试试吗,我只花了`用户系统经过1.673 0.050 1.721`
    • @noob 也许你的系统不够强大。您仍然可以使用outer,但您的函数一次需要 4 个参数。即outer(1:3, outer(1:3, 1:3, FUN = +), FUN = +),返回一个带有递归外层的数组
    • 感谢您的所有帮助 - 我正在尝试做这样的事情:stackoverflow.com/questions/68513888/… - 如果您有时间,可以看看吗?谢谢你的帮助 - 我真的很感激
    猜你喜欢
    • 2020-12-12
    • 2015-05-18
    • 2020-04-16
    • 1970-01-01
    • 2013-07-22
    • 2016-06-05
    • 2013-08-08
    • 2016-03-28
    • 2012-11-19
    相关资源
    最近更新 更多