r - 如何使用 "java.lang.Class"的预期返回类型?

标签 r scribe rjava

我想我会尝试写一个 R 接口(interface)到 Scribe (Pablo Fernandez 为 Java 编写的成熟 OAuth 库)作为一种让自己在 Java 上焕然一新的方式(8 年内没有使用它),学习 rJava 并更好地使用 Twitter API。但主要是因为现在是星期五下午,我认为这会很有趣。 :)

不幸的是,我还没有走多远……

我下载了.jar file for scribe还有commons-condec (它唯一的依赖项,我随后解压缩)。我已经使用 netbeans 在 Java 中运行了代码,并且使用他的 twitter example 运行良好.

通过遵循 rJava 文档,我对前几行代码没问题:

# load R packages
library(rJava)

# Initialise
.jinit()

# Add class paths
d1 <- "C:/Users/Tony/Documents/R/java/scribe-1.1.0.jar"
d2 <- "C:/Users/Tony/Documents/R/java/commons-codec-1.4/"
.jaddClassPath(path=c(d1, d2))

但是后来scribe quick start guide说需要以下内容:
// Java Code
OAuthService service = new ServiceBuilder()
                                .provider(TwitterApi.class)
                                .apiKey("6icbcAXyZx67r8uTAUM5Qw")
                                .apiSecret("SCCAdUUc6LXxiazxH3N0QfpNUvlUy84mZ2XZKiv39s")
                                .build();

我不知道如何将其重写为 rJava 用语。一个小小的网络搜索表明我应该分部分做,所以首先我做了:
# Create object (back to R code again)
( service <- .jnew("org.scribe.builder.ServiceBuilder") )
[1] "Java-Object{org.scribe.builder.ServiceBuilder@58fe64b9}"

# Set up apiKey and apiSecret using "$" shortcut
service$apiKey("6icbcAXyZx67r8uTAUM5Qw")
service$apiSecret("SCCAdUUc6LXxiazxH3N0QfpNUvlUy84mZ2XZKiv39s")

目前很好。然后我需要弄清楚提供者函数的返回类型是什么:
# Inspect return type
.jmethods(service, "provider")
[1] "public org.scribe.builder.ServiceBuilder org.scribe.builder.ServiceBuilder.provider(java.lang.Class)"

它需要“java.lang.Class”。这就是我感到困惑的地方。这意味着什么?我猜,看着 source ,它需要一个“ServiceBuilder”类型的返回类型,但是怎么做呢?这是我查看 ?.jcall 后的最佳猜测(注意:'use.true.class = TRUE' 没有做任何事情):
> .jcall(obj = service, returnSig = "Lorg.scribe.builder.ServiceBuilder;", method = "org.scribe.builder.ServiceBuilder.provider", "org.scribe.builder.api.TwitterApi")

Error in .jcall(obj = service, returnSig = "Lorg.scribe.builder.ServiceBuilder;",  : 
  method org.scribe.builder.ServiceBuilder.provider with signature (Ljava/lang/String;)Lorg.scribe.builder.ServiceBuilder; not found

有任何想法吗?

最佳答案

在我看来,提供者方法返回 ServiceBuilder 并将 Class 作为参数。

在 Java 中,如果您将类名放在 .class 之后,则在代码中创建一个类文字对象。如果您改为使用反射加载类,则可以通过其字符串名称引用一个类。我不确定这在 R 中是如何工作的,但在 Java 中,语法是:

Class c = Class.forName("org.scribe.builder.api.TwitterApi");

这会将类实例放入变量 c 中。然后你可以调用提供者方法:
service$provider(c);

关于r - 如何使用 "java.lang.Class"的预期返回类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5194382/

相关文章:

r - JRI 可以访问 Vista 上用户安装的软件包吗?

r - 无法在带有 Apple M1 芯片的 Macbook 上使用包 rJava,出现以下错误

r - 在字符串替换中避免 for 循环?

r - 从备份和恢复 R session 中停止 R 包构建和重新加载

java - Facebook 客户端应用程序的回调 URL 参数

java - 如何将 Scribe 与尚未实现的 Api 一起使用?

r - facet_wrap 按列填充

r - 我如何在 R 中将列转置/切割成行

erlang - 如何在 Erlang 中加载 Thrift 客户端

regex - R 正则表达式错误 :java. lang.NoSuchMethodException 中的 Mallet:给定参数没有合适的方法