2011-03-04 6 views
3

나는 R 인터페이스를 자바 (Pablo Fernandez에 의해 자바 용으로 성숙한 OAuth 라이브러리)에 쓰려고 노력했다. 자바에서 자신을 상쾌하게하는 방법으로 (rAava를 배우지 않고) rJava를 배우고 더 나은 사용법을 사용했다. Twitter API. 그러나 주로 금요일 오후이기 때문에 재미있을 거라 생각 했어. :) 예상되는 반환 형식 "java.lang.Class"로 작업하는 방법?

불행하게도 내가 아주 멀리 없어

이 ...

내가 .jar file for scribecommons-condec 다운로드 (유일한 의존성을, 내가 이후에 압축 해제한다). 나는 netbeans를 사용하여 Java 코드를 실행했으며 그의 twitter example을 사용하여 잘 작동합니다.

은 그냥 rJava의 documenation 따라 코드의 처음 몇 줄에 대한 확인을했다 :

# 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{[email protected]}" 

# 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 

어떤 아이디어가?

답변

1

Provider 메소드가 ServiceBuilder를 반환하고 Class를 매개 변수로 사용하는 것처럼 보입니다.

Java에서 클래스 이름 뒤에 .class를 붙이면 코드에서 클래스 리터럴 개체가됩니다. 리플렉션을 사용하여 클래스를로드하면 문자열 이름으로 클래스를 참조 할 수 있습니다. R에서 어떻게 작동하는지 잘 모르겠지만 자바에서는 구문이 다음과 같습니다.

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

이렇게하면 클래스 인스턴스가 변수 c에 저장됩니다. 그런 다음 공급자 메소드를 호출 할 수 있습니다.

service$provider(c); 
+0

제게는 올바른 조치가 필요합니다. 응원하는 사람에게는 소리가 나지만, rJava에 넣는 방법을 알아낼 수 없습니다. –

+0

Java 구문이하는 일은 "java.lang.Class"클래스에서 정적 메서드 "forName"을 호출합니다. rJava 또는 R을 모르지만 c <- J ("java.lang.Class") $ forName ("org.scribe.builder.api.TwitterApi")를 수행 할 수 있습니다. –