[Rd] about textConnection

Simon Urbanek simon.urbanek at r-project.org
Mon Mar 14 14:36:46 CET 2011


Kenn,

you might have had a point a while ago, but you may want to check most recent R and re-evaluate:

?textConnection
[...]
  object: character.  A description of the connection.  For an input
          this is an R character vector object, and for an output
          connection the name for the R character vector to receive the
          output, or 'NULL' (for none).
[...]

Details:

     An input text connection is opened and the character vector is
     copied at time the connection object is created, and 'close'
     destroys the copy.  'object' should be the name of a character
     vector: however, short expressions will be accepted provided they
     deparse to less than 60 bytes.

Cheers,
Simon



On Mar 14, 2011, at 7:32 AM, Kenn Konstabel wrote:

> Hello,
> 
> `textConnection`  prepares arguments for an internal function, and one of
> these arguments is "description" that must be a character vector of length 1
> (or so it seems).
> 
> Now the one and only argument you usually give to `textConnection` is
> called "object"; from the code you can see how this becomes a "description":
> 
>    .Internal(textConnection(deparse(substitute(object)), object,
>        open, env, type))
> 
> deparse(substitute(object)) -- which is intended to get the name of the
> object you supplied. Try
> 
>> obj <- "a 1\nb 2\nc 3"
>> deparse(substitute(obj))
> [1] "obj"
>> deparse(substitute("a 1\nb 2\nc 3"))
> [1] "\"a 1\\nb 2\\nc 3\""
> 
> This is called "non-standard evaluation" - in almost every other case it
> makes no difference whether you do some_fun(obj) or some_fun("a 1\nb 2\nc
> 3") but in this case it does.
> 
> Now for some reason (I'm not exactly sure why this happens) the result
> deparse+substitute of your gsub thing is a character vector of length 2.
> 
> ugly.string <-  deparse
> (substitute(gsub("&","\n",(strsplit('{"abc",{"def","X,1&Y,2&Z,3"}}','\\"')[[1]][6]))))
> 
> length( ugly.string)
> 
> Anyway, if the textConnection object has a "description" component then it
> is probably useful for something but something like "gsub(\"&\", \"\\n\",
> (strsplit(\"{\\\"abc\\\",{\\\"def\\\",\\\"X,1&Y,2&Z,3\\\"}}\" doesn't seem
> too useful. If you really hate the intermediate step (assignment) then a
> solution might be to use the internal textConnection function directly, or
> modify the code of `textConnection` e.g. like this:
> 
> tc <- function (object, open = "r", local = FALSE, encoding = c("",
>    "bytes", "UTF-8")) {
>    env <- if (local) parent.frame() else .GlobalEnv
>    type <- match(match.arg(encoding), c("", "bytes", "UTF-8"))
>    description <- deparse(substitute(object))
>    is.ugly <- function(x) length(x)>1
>    if(is.ugly(description)) description <- "a nice description"
>    .Internal(textConnection(description, object, open, env, type))
> }
> 
> # this will work with your examples
> 
> Bu the answer to your bug report was not particularly helpful (a simple
> "RTFC"  would have helped more) and from an ordinary mortal's  perspective
> it is also wrong.
> 
>>  your usage is incorrect.
>>     object: character.  A description of the connection.  For an input
>> this is an R character vector object ...
>> and you used an expression.  Some expressions work, but only
>> simple ones (and none are guaranteed to).
> 
> But what you actually used is "character" and not an expression:
> 
> is.character(gsub("&","\n",(strsplit('{"abc",{"def","X,1&Y,2&Z,3"}}','\\"')[[1]][6])))
> # TRUE
> is.expression(gsub("&","\n",(strsplit('{"abc",{"def","X,1&Y,2&Z,3"}}','\\"')[[1]][6])))
> # FALSE :-P
> 
> (Provided that standard evaluation is used which one would ordinarily
> expect.) So in my opinion, the documentation is not complete here: it should
> say explicitly that the object would better be a simple name and that
> otherwise the result is not guaranteed.
> 
> 
> Best regards,
> Kenn
> 
> 
> On Thu, Mar 10, 2011 at 12:20 PM, WANGSONG <mr.wangsong at hotmail.com> wrote:
> 
>> 
>> I need read a table in a string with special format. I used read.csv and
>> textConnection function.
>> But i am confuse about textConnection by follow code.
>> 
>> case A: It is OK£¡
>> str0 <- '{"abc",{"def","X,1&Y,2&Z,3"}}'
>> str1 <- strsplit(str0,'"')[[1]][6]
>> str2 <- gsub("&","\n", str1)
>> con  <- textConnection( str2 )
>> read.csv(con,header=F)
>> close(con)
>> 
>> case B: It is NOK!
>> con  <- textConnection(
>> gsub("&","\n",(strsplit('{"abc",{"def","X,1&Y,2&Z,3"}}','"')[[1]][6])) )
>> # Error in here
>> read.csv(con,header=F)
>> close(con)
>> 
>> case C: It is OK!
>> str0 <- '{"abc",{"def","X,1&Y,2&Z,3"}}'
>> con  <- textConnection( gsub("&","\n", (strsplit(str0,'"')[[1]][6])) )
>> read.csv(con,header=F)
>> close(con)
>> 
>> case D: It is OK!
>> str2 <- gsub("&","\n",
>> strsplit('{"abc",{"def","X,1&Y,2&Z,3"}}','"')[[1]][6])
>> con  <- textConnection( str2 )
>> read.csv(con,header=F)
>> close(con)
>> 
>> Except case B, textConnection report "invalid 'description' argument", in
>> other case, textConnection is OK.
>> 
>> I don't known, what is different£¿ I report it as [Bug 14527], But the
>> Answer is :
>>>  your usage is incorrect.
>>>     object: character.  A description of the connection.  For an input
>> this is an R character vector object ...
>>> and you used an expression.  Some expressions work, but only simple ones
>> (and none are guaranteed to).
>> 
>> I read the help carefully, but i don't known which usage is incorrect.
>> 
>> Would you help me?
>> 
>> 
>> WangSong
>> 
>> 
>>       [[alternative HTML version deleted]]
>> 
>> 
>> ______________________________________________
>> R-devel at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
>> 
>> 
> 
> 	[[alternative HTML version deleted]]
> 
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel



More information about the R-devel mailing list