2017-04-25 17 views
1

私は関数get_output_contentまたは少なくともget_output_length以下を探しています。これは、コンソールに表示された文字の数を示します。現在のコンソール出力の内容や長さを取得する方法は?

test <- function(){ 
    cat("ab") 
    cat("\b") 
    cat("cd") 
    c <- get_output_content() # "acd" (I'd be happy with "ab\bcd" as well) 
    l <- get_output_length() # 3 
    return(list(c,l)) 
} 
test() 

この例では、明らかに私は入力の文字数を簡単に数えることができましたが、他の関数を使用している場合はそうでないかもしれません。これらの機能のうちの一方または両方を構築する手助けはできますか?明確にする

EDIT:私の本当の状況で

提案されたソリューションでは、私が前に何を監視することなく与えられた時に表示される出力をカウントする必要があるように、私は、上流の仕事と前にカウントすることはできません。ここ

は、より多くの私は、私は簡単に満足のいくものを得るために、私の機能を微調整することができ、コンソールに何があるか数えることができた場合

library(pbapply) 
my_files <- paste0(1000:1,".pdf") 
work_on_pdf <- function(pdf_file){ 
    Sys.sleep(0.001) 
} 
report <- pbsapply(my_files,work_on_pdf) # the simple version, but I want to add the pdf name next to the bar to have more info about my progress 
# so I tried this but it's not satisfying because it "eats" some of the current output of pbapply 
report <- pbsapply(my_files,function(x){ 
    buffer_length <- 25 
    work_on_pdf(x) 
    catmsg <- paste0(c(# my additional message, which is in 3 parts: 
     rep("\b",buffer_length),   # (1) eat 25 characters 
     x,        # (2) print filename 
     rep(" ",buffer_length-nchar(x))), # (3) print spaces to cover up what may have been printed before 
     collapse="") 
    cat(catmsg) 
    }) 

を達成するために欲しいもののように見える再現性の例です。

NEW EDIT:例にではなく、一般的な質問へのFYI解決策:

それはの出力電流を測定している一般的な質問を、解決していませんが、私は、これで私の正確な問題を解決できますあなたが他の情報を持っていないときにコンソールを起動します。このような

library(pbapply) 
my_files <- paste0(1000:1,".pdf") 
work_on_pdf <- function(pdf_file){ 
    Sys.sleep(0.01) 
} 
pbsapply2 <- function(X,FUN,FUN2){ 
    # FUN2 will give the additional message 
    pbsapply(X,function(x){ 
    msg <- FUN2(x) 
    cat(msg) 
    output <- FUN(x) 
    eraser <- paste0(c( 
     rep("\b",nchar(msg)), # go back to position before additional message 
     rep(" ",nchar(msg)), # cover with blank spaces   
     rep("\b",nchar(msg))), # go back again to initial position 
     collapse="") 
    cat(eraser) 
    return(output) 
    })  
} 
report <- pbsapply2(my_files,work_on_pdf,function(x) paste("filename:",x)) 
+0

'NCHAR(capture.output(猫( "ABの\ BCD")))'? – Frank

+1

または 'sink()'はここでもっと便利かもしれません –

+0

私はどこかにシンクできると思っています。カウントしなければならないものを数えてから、コンソールでそれを取り消して再印刷します。 ! –

答えて

1

何か(?):

test <- function(){ 
    c <- paste0(capture.output(cat("ab")), 
       capture.output(cat("\b")), 
       capture.output(cat("cd"))) 
    n <- nchar(c) 
    l <- length(c) 
    return(list(c,n,l)) 
} 
test() 
関連する問題