使用文件参数在 OpenCPU 中调用 R 函数

Call a R function in OpenCPU with file arguments

我想让用户使用基于 Web 的界面调用带有自定义参数的自定义 R 函数。应该可以上传本地文件使用

我尝试使用 OpenCPU 实现此功能,到目前为止效果很好。用户的代码被打包成一个 ocpu.Snippet 并与参数 args 一起传递到

ocpu.call(
    'do.call',
    {
        'what': snippet,
        'args': args
    },
    session => /* processing of return value and console output */
);

这适用于我目前使用过的所有参数类型。

现在我正在测试文件的上传,我发现了以下内容:

  1. JavaScript wrapper(分叉以删除烦人的警报)仅检测位于最上层的文件(如上例中的 snippetargs)。这意味着由于我的 args 包含 一个文件对象 (args = { file: File }),因此在使用上面的调用时未检测到它们。但是,调用 ocpu.call('read.csv', args, ...) 有效,因为现在包装器检测到 file: File.
  2. OpenCPU only allows file uploads using multipart/form-data。据我所知,我在原始调用中使用的嵌套文件不能用这种格式表示。
  3. 我可以编写一个自定义 R 函数来使用,而不是使用 do.call,它允许以某种方式提供使用过的文件作为 "first-order" 参数,然后以某种方式将它们传递给提供的函数。

所以我被卡住了,因为我不知道如何编写这样的函数,我真的很想知道是否有更好的方法来调用自定义函数并远程控制其参数。你知道如何解决这个问题吗?

摸索了一下,发现函数写起来还是比较简单的:

functionCall <- function(func, ...) {
  return(do.call(func, list(...)))
}

使该函数在 OpenCPU 中可用后,可以使用

调用它
args = {
  func: snippet,
  x: firstArg,
  y: secondArg,
  // arbitrarily many args
}

opencpu.call(
  'functionCall',
  openCpuArgs,
  callback
);

我用调用 read.csvsnippet 测试了它,它成功地打印了它的内容而不是返回错误。