我想我会尝试为Scribe(Pablo Fernandez 为 Java 编写的成熟 OAuth 库)编写一个 R 接口,作为一种在 Java 上刷新自己的方式(8 年内没有使用它),学习 rJava 并更好地利用 Twitter API。但主要是因为现在是星期五下午,我认为这会很有趣。:)
不幸的是,我还没有走多远……
我为 scribe和commons-condec下载了.jar 文件(它的唯一依赖项,我随后解压缩)。我已经使用 netbeans 在 Java 中运行了代码,并且使用他的twitter 示例运行良好。
通过遵循 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))
但随后抄写员快速入门指南说需要以下内容:
// 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”。这就是我感到困惑的地方。这意味着什么?我想,看看源代码,它需要一个“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
有任何想法吗?