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

时间:2017-07-23 16:01:06

标签: javascript r opencpu

我想让用户使用基于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,这允许某种方式提供使用过的文件作为"一阶"参数然后以某种方式将它们传递给提供的函数。
  4. 所以我被困了,因为我不知道如何编写这样的函数,我真的很想知道是否有更好的方法来调用自定义函数并远程控制其参数。你知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

在摆弄了一下之后,我发现这个函数相对容易编写:

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

在OpenCPU中使用该功能后,可以使用

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

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

我使用调用snippet的{​​{1}}对其进行了测试,并成功打印了内容而不是返回错误。