Bert, Thank you for your reply. You are correct that your code will print the contents of the data frame. While it works, it is not as elegant as the lm function. One does not have to pass the independent and dependent variables to lm In parentheses. Fit1<-lm(y~x,data=mydata) None of the parameters to lm are passed in quotation marks. Somehow, using deparse(substitute()) and other magic lm is able to get the data in the dataframe mydata. I want to be able to do the same magic in functions I write; pass a dataframe and column names, all without quotation marks and be able to write code that will provide access to the columns of the dataframe without having to pass the column names in quotation marks. Thank you, John John David Sorkin M.D., Ph.D. Professor of Medicine Chief, Biostatistics and Informatics University of Maryland School of Medicine Division of Gerontology and Geriatric Medicine Baltimore VA Medical Center 10 North Greene Street<x-apple-data-detectors://12> GRECC<x-apple-data-detectors://12> (BT/18/GR) Baltimore, MD 21201-1524<x-apple-data-detectors://13/0> (Phone) 410-605-711<tel:410-605-7119>9 (Fax) 410-605-7913<tel:410-605-7913> (Please call phone number above prior to faxing) On May 29, 2019, at 9:59 PM, Bert Gunter <bgunter.4567 at gmail.com<mailto:bgunter.4567 at gmail.com>> wrote: Basically, huh?> df <- data.frame(a = 1:3, b = letters[1:3]) > nm <- names(df) > print(df[,nm[1]])[1] 1 2 3> print(df[,nm[2]])[1] a b c Levels: a b c This can be done within a function, of course:> demo <- function(df, colnames){+ print(df[,colnames]) + }> demo(df,c("a","b"))a b 1 1 a 2 2 b 3 3 c Am I missing something? (Apologies, if so). Bert Gunter On Wed, May 29, 2019 at 6:40 PM Sorkin, John <jsorkin at som.umaryland.edu<mailto:jsorkin at som.umaryland.edu>> wrote: Thanks to several kind people, I understand how to use deparse(substitute(paramter)) to get as text strings the arguments passed to an R function. What I still can't do is put the text strings recovered by deparse(substitute(parameter)) back together to get the columns of a dataframe passed to the function. What I want to do is pass a column name to a function along with the name of the dataframe and then, within the function access the column of the dataframe. I want the function below to print the columns of the dataframe testdata, i.e. testdata[,"FSG"] and testdata[,"GCM"]. I have tried several ways to tell the function to print the columns; none of them work. I thank everyone who has helped in the past, and those people who will help me now! John testdata <- structure(list(FSG = c(271L, 288L, 269L, 297L, 311L, 217L, 235L, 172L, 201L, 162L), CGM = c(205L, 273L, 226L, 235L, 311L, 201L, 203L, 155L, 182L, 163L)), row.names = c(NA, 10L), class = "data.frame") cat("This is the data frame") class(testdata) testdata BAPlot <- function(first,second,indata){ # these lines of code work col1 <- deparse(substitute(first)) col2 <- deparse(substitute(second)) thedata <- deparse(substitute(third)) print(col1) print(col2) print(thedata) cat("This gets the data, but not as a dataframe\n") zoop<-paste(indata) print(zoop) cat("End This gets the data, but not as a dataframe\n") # these lines do not work print(indata[,first]) print(indata[,"first"]) print(thedata[,col1]) paste(zoop[,paste(first)]) paste(zoop[,first]) zap<-paste(first) print(zap) } [[alternative HTML version deleted]] ______________________________________________ R-help at r-project.org<mailto:R-help at r-project.org> mailing list -- To UNSUBSCRIBE and more, see https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code. [[alternative HTML version deleted]]
Depends on how you want to specify variables. You are not clear (to me) on
this. But, for instance:
demo <- function(form,df)
{
av <- all.vars(form)
df[,av]
}
demo(~a+b, df)
demo(a~b,df)
?all.vars, ?all.names for details
Bert Gunter
On Wed, May 29, 2019 at 7:33 PM Sorkin, John <jsorkin at
som.umaryland.edu>
wrote:
> Bert,
> Thank you for your reply. You are correct that your code will print the
> contents of the data frame. While it works, it is not as elegant as the lm
> function. One does not have to pass the independent and dependent variables
> to lm In parentheses.
>
> Fit1<-lm(y~x,data=mydata)
>
> None of the parameters to lm are passed in quotation marks. Somehow, using
> deparse(substitute()) and other magic lm is able to get the data in the
> dataframe mydata. I want to be able to do the same magic in functions I
> write; pass a dataframe and column names, all without quotation marks and
> be able to write code that will provide access to the columns of the
> dataframe without having to pass the column names in quotation marks.
> Thank you,
> John
>
> John David Sorkin M.D., Ph.D.
>
> Professor of Medicine
>
> Chief, Biostatistics and Informatics
>
> University of Maryland School of Medicine Division of Gerontology and
> Geriatric Medicine
>
> Baltimore VA Medical Center
>
> 10 North Greene Street
>
> GRECC (BT/18/GR)
>
> Baltimore, MD 21201-1524
>
> (Phone) 410-605-711 <410-605-7119>9
>
> (Fax) 410-605-7913 (Please call phone number above prior to faxing)
>
>
> On May 29, 2019, at 9:59 PM, Bert Gunter <bgunter.4567 at gmail.com>
wrote:
>
> Basically, huh?
>
> > df <- data.frame(a = 1:3, b = letters[1:3])
> > nm <- names(df)
> > print(df[,nm[1]])
> [1] 1 2 3
> > print(df[,nm[2]])
> [1] a b c
> Levels: a b c
>
> This can be done within a function, of course:
>
> > demo <- function(df, colnames){
> + print(df[,colnames])
> + }
> > demo(df,c("a","b"))
> a b
> 1 1 a
> 2 2 b
> 3 3 c
>
> Am I missing something? (Apologies, if so).
>
> Bert Gunter
>
>
>
> On Wed, May 29, 2019 at 6:40 PM Sorkin, John <jsorkin at
som.umaryland.edu>
> wrote:
>
>> Thanks to several kind people, I understand how to use
>> deparse(substitute(paramter)) to get as text strings the arguments
passed
>> to an R function. What I still can't do is put the text strings
recovered
>> by deparse(substitute(parameter)) back together to get the columns of a
>> dataframe passed to the function. What I want to do is pass a column
name
>> to a function along with the name of the dataframe and then, within the
>> function access the column of the dataframe.
>>
>> I want the function below to print the columns of the dataframe
testdata,
>> i.e. testdata[,"FSG"] and testdata[,"GCM"]. I have
tried several ways to
>> tell the function to print the columns; none of them work.
>>
>> I thank everyone who has helped in the past, and those people who will
>> help me now!
>>
>> John
>>
>> testdata <- structure(list(FSG = c(271L, 288L, 269L, 297L, 311L,
217L,
>> 235L,
>>
>> 172L, 201L, 162L), CGM = c(205L,
273L,
>> 226L, 235L, 311L, 201L,
>>
>> 203L, 155L, 182L, 163L)), row.names
>> c(NA, 10L), class = "data.frame")
>>
>> cat("This is the data frame")
>>
>> class(testdata)
>>
>> testdata
>>
>>
>>
>> BAPlot <- function(first,second,indata){
>>
>> # these lines of code work
>>
>> col1 <- deparse(substitute(first))
>>
>> col2 <- deparse(substitute(second))
>>
>> thedata <- deparse(substitute(third))
>>
>> print(col1)
>>
>> print(col2)
>>
>> print(thedata)
>>
>> cat("This gets the data, but not as a dataframe\n")
>>
>> zoop<-paste(indata)
>>
>> print(zoop)
>>
>> cat("End This gets the data, but not as a dataframe\n")
>>
>> # these lines do not work
>>
>> print(indata[,first])
>>
>> print(indata[,"first"])
>>
>> print(thedata[,col1])
>>
>> paste(zoop[,paste(first)])
>>
>> paste(zoop[,first])
>>
>> zap<-paste(first)
>>
>> print(zap)
>>
>> }
>>
>>
>>
>>
>> [[alternative HTML version deleted]]
>>
>> ______________________________________________
>> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> PLEASE do read the posting guide
>> http://www.R-project.org/posting-guide.html
>> and provide commented, minimal, self-contained, reproducible code.
>>
>
[[alternative HTML version deleted]]
Colleagues,
Despite Bert having tried to help me, I am still unable to perform a simple act
with a function. I want to pass the names of the columns of a dataframe along
with the name of the dataframe, and use the parameters to allow the function to
access the dataframe and modify its contents.
I apologize multiple postings regarding this question, but it is a fundamental
concept that one who wants to program in R needs to know.
Thank you,
John
# Create a toy dataframe.
df <- data.frame(a=c(1:20),b=(20:39))
df
# Set up a function that will access the first and second columns of the
# data frame, print the columns of the dataframe and add the columns
demo <- function(first,second,df)
{
# None of the following work
print(df[,all.vars(first)])
print(df[,first])
print(df[,"first"])
print(df[,all.vars(second)])
print(df[,second])
print(df[,"second"])
df[,"sum"] <- print(df[,first])+print(df[,second])
}
demo(a,b, df)
John David Sorkin M.D., Ph.D.
Professor of Medicine
Chief, Biostatistics and Informatics
University of Maryland School of Medicine Division of Gerontology and Geriatric
Medicine
Baltimore VA Medical Center
10 North Greene Street
GRECC (BT/18/GR)
Baltimore, MD 21201-1524
(Phone) 410-605-7119
(Fax) 410-605-7913 (Please call phone number above prior to faxing)
________________________________
From: Bert Gunter <bgunter.4567 at gmail.com>
Sent: Wednesday, May 29, 2019 11:27 PM
To: Sorkin, John
Cc: r-help at r-project.org
Subject: Re: [R] Tying to underdressed the magic of lm redux
Depends on how you want to specify variables. You are not clear (to me) on this.
But, for instance:
demo <- function(form,df)
{
av <- all.vars(form)
df[,av]
}
demo(~a+b, df)
demo(a~b,df)
?all.vars, ?all.names for details
Bert Gunter
On Wed, May 29, 2019 at 7:33 PM Sorkin, John <jsorkin at
som.umaryland.edu<mailto:jsorkin at som.umaryland.edu>> wrote:
Bert,
Thank you for your reply. You are correct that your code will print the contents
of the data frame. While it works, it is not as elegant as the lm function. One
does not have to pass the independent and dependent variables to lm In
parentheses.
Fit1<-lm(y~x,data=mydata)
None of the parameters to lm are passed in quotation marks. Somehow, using
deparse(substitute()) and other magic lm is able to get the data in the
dataframe mydata. I want to be able to do the same magic in functions I write;
pass a dataframe and column names, all without quotation marks and be able to
write code that will provide access to the columns of the dataframe without
having to pass the column names in quotation marks.
Thank you,
John
John David Sorkin M.D., Ph.D.
Professor of Medicine
Chief, Biostatistics and Informatics
University of Maryland School of Medicine Division of Gerontology and Geriatric
Medicine
Baltimore VA Medical Center
10 North Greene Street
GRECC (BT/18/GR)
Baltimore, MD 21201-1524
(Phone) 410-605-711<tel:410-605-7119>9
(Fax) 410-605-7913<tel:410-605-7913> (Please call phone number above prior
to faxing)
On May 29, 2019, at 9:59 PM, Bert Gunter <bgunter.4567 at
gmail.com<mailto:bgunter.4567 at gmail.com>> wrote:
Basically, huh?
> df <- data.frame(a = 1:3, b = letters[1:3])
> nm <- names(df)
> print(df[,nm[1]])
[1] 1 2 3> print(df[,nm[2]])
[1] a b c
Levels: a b c
This can be done within a function, of course:
> demo <- function(df, colnames){
+ print(df[,colnames])
+ }> demo(df,c("a","b"))
a b
1 1 a
2 2 b
3 3 c
Am I missing something? (Apologies, if so).
Bert Gunter
On Wed, May 29, 2019 at 6:40 PM Sorkin, John <jsorkin at
som.umaryland.edu<mailto:jsorkin at som.umaryland.edu>> wrote:
Thanks to several kind people, I understand how to use
deparse(substitute(paramter)) to get as text strings the arguments passed to an
R function. What I still can't do is put the text strings recovered by
deparse(substitute(parameter)) back together to get the columns of a dataframe
passed to the function. What I want to do is pass a column name to a function
along with the name of the dataframe and then, within the function access the
column of the dataframe.
I want the function below to print the columns of the dataframe testdata, i.e.
testdata[,"FSG"] and testdata[,"GCM"]. I have tried several
ways to tell the function to print the columns; none of them work.
I thank everyone who has helped in the past, and those people who will help me
now!
John
testdata <- structure(list(FSG = c(271L, 288L, 269L, 297L, 311L, 217L, 235L,
172L, 201L, 162L), CGM = c(205L, 273L, 226L,
235L, 311L, 201L,
203L, 155L, 182L, 163L)), row.names = c(NA,
10L), class = "data.frame")
cat("This is the data frame")
class(testdata)
testdata
BAPlot <- function(first,second,indata){
# these lines of code work
col1 <- deparse(substitute(first))
col2 <- deparse(substitute(second))
thedata <- deparse(substitute(third))
print(col1)
print(col2)
print(thedata)
cat("This gets the data, but not as a dataframe\n")
zoop<-paste(indata)
print(zoop)
cat("End This gets the data, but not as a dataframe\n")
# these lines do not work
print(indata[,first])
print(indata[,"first"])
print(thedata[,col1])
paste(zoop[,paste(first)])
paste(zoop[,first])
zap<-paste(first)
print(zap)
}
[[alternative HTML version deleted]]
______________________________________________
R-help at r-project.org<mailto:R-help at r-project.org> mailing list -- To
UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.
[[alternative HTML version deleted]]